很多很多年以前,小鸟
和小猫
都来自同一个祖先
,都生活在水里。后来部分炎日的地区开始干旱,环境发生了重点变化,祖先们有些进化出了翅膀,有些进化出了四肢,适应了下来...
我们不考究进化论的真伪,只是想通过故事引出一个继承关系
,那就是小鸟
、小猫
继承于一个叫祖先
的物种。
# 祖先
class Ancestor():
def ahead(self):
print('go ahead')
# 小鸟
class Brid(Ancestor): # 继承 Ancestor
def fly(self):
print('flying')
# 小猫
class Cat(Ancestor):
def run(self):
print('runing')
>>> b = Brid()
>>> b.ahead() # 继承之后,子类获取父类方法的使用权
'go ahead'
>>> b.fly()
'flying'
>>> c = Cat()
>>> c.ahead()
'go ahead'
>>> c.run()
'runing'
默认Ancestor是继承于Object的Ancestor(Object)
,不写等于默认。
子类可以改写父类
的方法和属性。
# 祖先
class Ancestor():
def __init__(self):
self.name = 'ancestor'
def ahead(self):
print('go ahead')
# 小鸟
class Brid(Ancestor):
def __init__(self):
self.name = 'brid' # 子类的name的值会覆盖类父类的name
def fly(self):
print('flying')
>>> Brid().name
'brid'
super()
是在子类中操作父类的一个接口。
# 祖先
class Ancestor():
def __init__(self):
self.name = 'ancestor'
def ahead(self):
print('go ahead')
# 小鸟
class Brid(Ancestor):
def __init__(self):
self.name = 'brid'
super().__init__() # 执行父类 __init__() 初始化方法
def fly(self):
super().ahead() # 执行父类 ahead() 方法
print('flying')
>>> Brid().name
'ancestor' # 我们子类覆盖的name值,又被super().__init__() 重新覆盖了
>>> Brid().fly()
'go ahead' # super().ahead()
'flying'
我不知道这个世界上有哪种生物跑得又快,又是可以飞的,所以给它起名 X
。
# 祖先
class Ancestor():
def __init__(self):
self.name = 'ancestor'
def ahead(self):
print('go ahead')
# 小鸟
class Brid(Ancestor): # 继承 Ancestor
def fly(self):
print('flying')
# 小猫
class Cat(Ancestor):
def run(self):
print('runing')
# X 生物
class X(Brid, Cat):
pass
>>> X().ahead()
'go ahead'
>>> X().fly()
'flying'
>>> X().run()
'runing'
多重继承就是一个类,继承于多个类。我们现在的继承关系是 祖先 - [小鸟,小猫]
,[小鸟,小猫] - [[ X ]]
,X 生物具备了我们所定义物种的所有能力。
对象检测
,可用做类型判断
。
>>> x = X()
>>> isinstance(x, X) # x 属于 X 这个类吗?
True
>>> isinstance(x, Ancestor) # isinstance 的检测标准包含父类
True
>>> isinstance(x, Cat)
True
>>> isinstance(x, Brid)
True