继承解析
collections 模块中有一些派生自 ABC 的具体类;当然这些类还可以进一步被派生。此外,collections.abc 子模块中有一些 ABC 可被用于测试一个类或实例是否提供特定的接口,例如它是否可哈希或它是否为映射等。
该模块提供了一个元类 ABCMeta,可以用来定义抽象类,另外还提供一个工具类 ABC,可以用它以继承的方式定义抽象基类。
class abc.ABC
一个使用 ABCMeta 作为元类的工具类。抽象基类可以通过从 ABC 派生来简单地创建,这就避免了在某些情况下会令人混淆的元类用法,例如:
from abc import ABC
class MyABC(ABC):
pass
注意 ABC 的类型仍然是 ABCMeta,因此继承 ABC 仍然需要关注元类使用中的注意事项,比如可能会导致元类冲突的多重继承。当然你也可以直接使用 ABCMeta 作为元类来定义抽象基类,例如:
from abc import ABCMeta
class MyABC(metaclass=ABCMeta):
pass
举例说明
# Python的三态:继承、封装、多态
#面向对象继承:将多个类共有的方法提取到父类,子类只需要继承父类即可
#单继承
class Animal():
def eat(self):
'''
吃
:return:
'''
print('在吃饭')
pass
def drink(self):
'''
喝
:return:
'''
print('在喝水')
pass
class Dog(Animal): #继承了Animal父类
def ha(self):
'''
实现子类独有的属性
:return:
'''
print('小狗在叫')
pass
class Cat(Animal): #继承了Animal父类
def mia(self):
print('小猫在叫')
pass
d=Dog()
d.eat()
c=Cat()
c.eat()
c.drink()
#多继承
class A(object):
def a(self):
print('A类的方法输出')
class B(object):
def b(self):
print('b类的方法的输出')
class C(A,B): #C类中并没有方法,是继承自A和B
pass
c=C()
c.a()
c.b()
#当多个父类中存在相同的方法时,应该调用哪个方法
class Z(object):
def eat(self):
print('D.eat')
pass
pass
class Y(Z):
def eat(self):
print('Y.eat')
pass
pass
class X(Z):
pass
class S(X,Y): #首先在S中查找eat方法,如果没有,就去X中查找eat方法,如果没有,再去Y中查找,如果Y中没有,就去Z中查找
pass
s=S()
s.eat()
print(S.__mro__)
运行的结果