默认类型

class A:

    class_name = 'python23期'

    def __init__(self, name, age):

        self.name = name
self.age =age a1 = A('李业', 21) # 实例化一个a1的对象
print(a1.name) a2 = A('李东宇', 24) # 实例化一个a2的对象
print(a2.age)

封装

把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情况具体分析. 比如. 你写了⼀个很⽜B的函数. 那这个也可以被称为封装. 在⾯向对象思想中. 是把⼀些看似⽆关紧要的内容组合到⼀起统⼀进⾏存储和使⽤. 这就是封装.

多态

一个事务有多种形态 比如水

什么是多态: 在python中默认支持多态,就是a可以定义多种数据类型,不用规定其所属的数据类型,可以是字符串,列表,元组等任意数据类型

python中定义变量不用规定变量的类型
a = 'alex'
a = [1, 2, 3]
a = (22, 33) Java
int a = 12 # a必须是整型
String b = 'abc'# b必须是一个字符串类型的

鸭子类型

python中你看起来像鸭子,那么你就是鸭子

就是相互独立的两个类,本身是没有什么关系的,然后它们内部有共同的名字func,这种就是鸭子

格式

class A:

    def login(self):
pass def register(self):
pass class B: def login(self):
pass def register(self):
pass
# A,B两个类,没有任何关系,独立两个,但是里面的功能相似,所以python一般会将类似于A,B两个类
# 里面的相似的功能让其命名相同.
# 1. A,B虽然无关系,但是很默契的制定了一个规范.让你使用起来更方便.

super

格式

class A:
def f1(self):
print('in A f1') def f2(self):
print('in A f2') class Foo(A):
def f1(self):
# super().f2()
super(Foo, self).f2()
print('in A Foo') obj = Foo()
obj.f1()
# 执行结果
in A f2
in A Foo class A:
def f1(self):
print('in A') class Foo(A):
def f1(self):
super(Foo,self).f1()
print('in Foo') # 2 class Bar(A):
def f1(self):
print('in Bar') # 1 class Info(Foo,Bar): def f1(self):
super(Info,self).f1()
print('in Info f1') # 3 obj = Info()
print(Info.mro()) # [Info, Foo, Bar, A]
obj.f1()
# 执行结果
[<class '__main__.Info'>, <class '__main__.Foo'>, <class '__main__.Bar'>, <class '__main__.A'>, <class 'object'>]
in Bar
in Foo
in Info f1

super() 严格意义并不是执行父类的方法.

单继承: super() 肯定是执行父类的方法.

多继承: super(S,self) 严格按照self从属于的类的mro的执行顺序,执行 S类的下一位.***

类的约束

# 版本二 统一接口
class Wecht: def pay(self,money):
print(f'利用微信支付了{money}') class Alipay: def pay(self, money):
print(f'利用支付宝支付了{money}') def pay(obj, money): # 定义一个统一化的设计
obj.pay(money) obj1 = Wecht()
obj2 = Alipay() pay(obj1,200)
pay(obj2,300) # 输出结果
利用微信支付了200
利用支付宝支付了300 # 版本三 野路子写法 # 版本四 按照之前的代码逻辑进行改变 发现问题:
以上代码没有约束,原因就是想怎么写就怎么写,都能实现当时的功能(个人理解)
在上面的情况下(在一些重要的逻辑,与用户数据相关等核心部分),我们要建立一种约束,避免发生此类错误

类的约束有两种解决方式

  1. 在父类建立一种约束
  2. 利用抽象类(指定的一种规范)的概念

第一种解决方式(建议使用方式)

在父类定义一个pay方法,主动抛出异常,如果子类没有定义pay方法,并且

再建立一个父类pay的方法,约定俗称定义一种规范,子类要定义pay方法,但是没有强制性,还是可以执行
raise 主动报错提醒
class Payment:
def pay(self,money):
raise Exception('必须得定义这个类') class Wechat(Payment): def pay(self,money):
print(f'利用微信支付了{money}') class Alipay(Payment): def pay(self, money):
print(f'利用支付宝支付了{money}') class QQpay(Payment): def fuqian(self, money):
print(f'利用QQ支付了{money}') def pay(obj, money):
obj.pay(money) obj1 = Wechat()
obj2 = Alipay() pay(obj1,200)
pay(obj2,300) obj3 = QQpay()
pay(obj3,599) # 输出结果
Traceback (most recent call last):
File "/Users/wuqiang/work/PycharmProjects/python23/day24/day24.py", line 50, in <module>
pay(obj3,599)
File "/Users/wuqiang/work/PycharmProjects/python23/day24/day24.py", line 41, in pay
obj.pay(money)
File "/Users/wuqiang/work/PycharmProjects/python23/day24/day24.py", line 22, in pay
raise Exception('必须得定义这个类')
Exception: 必须得定义这个类

第二种解决方式

利用抽象类概念, 基类如先设置,子类如果没有定义pay方法,在实例化对象的时候就会抛出错误

from abc import ABCMeta,abstractmethod
class Payment(metaclass=ABCMeta):
@abstractmethod
def pay(self, money):
pass class Wecht(Payment): def pay(self,money):
print(f'利用微信支付了{money}') class Alipay(Payment): def pay(self, money):
print(f'利用支付宝支付了{money}') class QQpay(Payment): def fuqian(self, money):
print(f'利用QQ支付了{money}') obj3 = QQpay()
# 输出结果
obj3 = QQpay()
TypeError: Can't instantiate abstract class QQpay with abstract methods pay

python之面向对象性封装,多态,以及鸭子类型的更多相关文章

  1. Python面向对象04 /封装、多态、鸭子类型、类的约束、super

    Python面向对象04 /封装.多态.鸭子类型.类的约束.super 目录 Python面向对象04 /封装.多态.鸭子类型.类的约束.super 1. 封装 2. 多态 3. 鸭子类型 4. 类的 ...

  2. python 面向对象专题(四):封装、多态、鸭子类型、类的约束、super

    https://www.cnblogs.com/liubing8/p/11321099.html 目录 Python面向对象04 /封装.多态.鸭子类型.类的约束.super 1. 封装 2. 多态 ...

  3. 第7.3节 Python特色的面向对象设计:协议、多态及鸭子类型

    Python是一种多态语言,其表现特征是:对象方法的调用方只管方法是否可调用,不管对象是什么类型,从而屏蔽不同类型对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化. 一.    P ...

  4. PythonI/O进阶学习笔记_3.1面向对象编程_python的多态和鸭子类型

    前言: 与第一篇的面向对象内容不同的是,第一篇中的面向对象更多的是与类.对象结合起来的概念粗浅理解,就是在编程历史中诞生的一种思想方法. 这篇的面向对象编程,更多落实到在语言设计实现中,是如何体现面向 ...

  5. 多态 与 鸭子类型 duck duck duck

    # --> ''' 多态 与 鸭子类型 --> 什么是多态 对象的多种状态,父类对象的多种 (子类对象) 状态 --> 什么是鸭子类型: 长的像就是 1.规定有什么属性及什么方法的对 ...

  6. 封装之property,多态,鸭子类型,classmethod与staticmethod

    一.封装之Property prooerty是一种特殊的属性,访问时他会执行一段功能(函数)然后返回 '''BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而非方法,如果我们将其做成一个属 ...

  7. python 面向对象三大特性(封装 多态 继承)

    今天我们来学习一种新的编程方式:面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)注:Java和C#来说只支持面向对象编程,而python比较灵活即支持面 ...

  8. python多态和鸭子类型

    多态与多态性 多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承). 比如:文件分为文本文件,可执行文件(在定义角度) 比如 我们按下 F1 键这个动作: 如果当前在 Fl ...

  9. Python多态、鸭子类型

    一.多态 多态指的是一类事物有多种形态. 动物有多种形态:人,狗,猪 import abc class Animal(metaclass=abc.ABCMeta): #同一类事物:动物 @abc.ab ...

随机推荐

  1. 记一次crontab执行和日志生成问题

    一.crontab未执行 crontab里面设置定时任务如下: 1 19 * * * /usr/bin/python3 /home/nola/a.py > /home/nola/logs/a_l ...

  2. python画一颗拳头大的💗

    用上turtle库后,各种画,今天画个拳头大的爱心@.@. 下面贴下代码: # -*- coding: utf-8 -*- # Nola import pygame import time impor ...

  3. LeetCode python实现题解(持续更新)

    目录 LeetCode Python实现算法简介 0001 两数之和 0002 两数相加 0003 无重复字符的最长子串 0004 寻找两个有序数组的中位数 0005 最长回文子串 0006 Z字型变 ...

  4. vmware workstaion之不能连接外网

    Vmwareworkstation15系列桥接模式不能上网解决办法 最近在vmwareworkstation15中创建一个双网卡虚拟机,由于一直连不了外网,一直困扰着我.各种姿势在百度谷歌查找,最终还 ...

  5. vue+express+mysql项目总结(node项目部署阿里云通用)

    原文发布于我的个人博客上:原文点这里   前面经历千辛万苦,终于把博客的所有东西都准备好了,现在就只等部署了.下面我介绍下我的部署过程: 一.购买服务器和域名   如果需要域名(不用域名通过ip也可以 ...

  6. https信任库采坑记

    最近在客户现场遇到一个棘手的http问题,现象很直接,访问某https的时候报错: javax.net.ssl.SSLPeerUnverifiedException: peer not authent ...

  7. XCTF---easyjni的WriteUp

    一.题目来源     题目来源:XCTF的mobile区的easyjni题目.     题目下载地址:题目链接地址 二.解题过程     1.下载好题目后,安装到夜神模拟器中,发现有一个输入框和一个按 ...

  8. 小程序的数据存储,与Django等服务发送请求

    目录 官方文档 快速归纳 存取改删 1.wx存储数据到本地以及本地获取数 1.1 wx.setStorageSync(string key, any data) 存(同步) 1.2 wx.setSto ...

  9. Spring Cloud 理论篇

    show me the code and talk to me,做的出来更要说的明白 github同步收录 我是布尔bl,你的支持是我分享的动力! 微服务 在 jsp 时代,应用前后端耦合,前后端 a ...

  10. 【MySQL】Docker搭建MySQL8.0

    目录 Docker搭建MySQL8.0 目的: 1.安装Docker 2.查看docker镜像 3.拉取mysql官方镜像 4. 查看目前的镜像 5.运行docker mysql镜像 6.查看目前运行 ...