元类,归一化设计,抽象类
元类:
对象是被创造出来的,被类实例化出来的,类也是被创造出来的,是被特殊的方式创造的
能够创造不同寻常的类。
1 不能被实例化
2 有且只有一个实例
常规的类特点:
1 能够被实例化
2 具有属性
3 具有方法
类= type(对象)
type = type(类)
所有的类型,说的都是这个对象是属于哪一个类的
所有的用class常规语法创造出来的类,都是type类型型
print(type(Course)) print(type(int)) print(type(str))
归一化设计
当所有的类中都有一样的方式时,通常使用归一化设计,统一调用
class Wechatpay: def __init__(self, name, money): self.name = name self.money = money def pay(self): print('%s通过微信支付了%s元' % (self.name, self.money)) class Alipay: def __init__(self, name, money): self.name = name self.money = money def pay(self): print('%s通过支付宝支付了%s元' % (self.name, self.money)) class ApplePay: def __init__(self, name, money): self.name = name self.money = money def fuqian(self): print('%s通过apple pay支付了%s元' % (self.name, self.money)) # 归一化设计 def pay(person): # 这里就是归一化设计了,上面的类中,都有存在同样的函数方法名,就可以使用归一化设计 person.pay() wcp = Wechatpay('alex', 2000000) pay(wcp) # 这里 是调用归一化设计的地方, ali = Alipay('alex', 2000000) app = ApplePay('alex', 2000000) pay(app)
抽象类:
约束子类,规范代码,被abcstractmethod装饰器装饰的函数,在子类中都必须拥有一个名称相同的方法
from abc import ABCMeta,abstractmethod class Payment(metaclass = ABCMeta): @abstractmethod # 这里就是装饰器了 def pay(self): #这个方法,在这个类的子类中必须存在 pass
多态:
在传递参数的时候,如果要传递的对象有可能是多个类的对象
1 我们又必须在语言中清楚的描述出到第是哪一个类型的独享
2 我们就可以使用继承的形式,有一个父类作为这些所有可能被传递进来的对象的基类
3 基础类型就可以写成这个父类
4 于是所有子类的对象都是属于这个父类的
在python中,因为要传递的对象的类型在定义阶段不需要明确,所以我们在Python中处处是多态
数据的类型不需要通过继承来维护统一
鸭子类型:
多个相似的类具有相同的方法名
但是又不通过抽象类或者继承父类约束的
这几个具有相同方法的类就是鸭子类型