封装,多态,继承. super的方法,类的约束,

1.python的三大特性:
python的三大特性,封装,多态,继承
封装:函数 模块 类 对象
多态 : python中默认支持多态
继承: python中的子类继承父类属性和方法

鸭子类型: 看着像鸭子,它就是鸭子
python中处处都是鸭子
# 两者之间没有任何关系,但是都遵循着一个隐形的标准
两个类中的鸭子类型:
# 优点:1,统一标准,减少了词汇量
# 2,两者之间没有任何耦合性,但是可以产生关系,其中一个的对象可以调用另一个类的方法
# 其他例子 :index pop clear


2. super的用法:

    super(A类,self).方法 跳过A类,按照mro的顺序执行下一类的方法
      #可以执行非本类方法的方法必须在有继承关系的类中使用
class A:
    def eat(self):
        print('eat A')
class B(A):
    def eat(self):
        super(B,self).eat()     #跳过B类,按照mro的顺序执行0
        print('eat B')
obj = B()
obj.eat()
print(B.mro())  #[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
#查看mro的顺序 类名+ . + mro +()

3. 类的约束:有两种方法
第一种:raise Exception 抛出异常
在父类中定义好子类要有的方法
class Payment:
    def pay(self,money):
        raise Exception('子类要定义pay的方法')
class A(Payment):
    def pay(self,money):      #Exception: 子类要定义pay的方法
        print(111)
class B(Payment):
    def zhifu(self,money):
        pass
def pay(obj,money):
    obj.pay(money)
obj1 = B()
pay(obj1,100)


第二种:抽象类 接口类 :制定一个规范,强制子类必须有pay方法,如果没有,在你实例化的时候就会报错
from abc import ABCMeta,abstractmethod
class A(metaclass=ABCMeta): #父类里面的抽象方法,子类一定要实现
    @abstractmethod#抽象方法    #强制子类执行eat,chi方法,没有就报错
    def eat(self,money):
        print(111)
    @abstractmethod
    def chi(self,money):
        pass
class B(A):
    def eat(self,money):
        pass
class C(A):
    def eat(self,money):
        pass
    def chi(self,money):
        print(111)
def eat(obj,money):
    obj.chi(money)
obj1 = B()
eat(obj1,100)





原文地址:https://www.cnblogs.com/shicongcong0910/p/10325049.html