Python 继承

故事

很多很多年以前,小鸟小猫都来自同一个祖先,都生活在水里。后来部分炎日的地区开始干旱,环境发生了重点变化,祖先们有些进化出了翅膀,有些进化出了四肢,适应了下来...


继承

我们不考究进化论的真伪,只是想通过故事引出一个继承关系,那就是小鸟小猫继承于一个叫祖先的物种。

# 祖先
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()

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 生物具备了我们所定义物种的所有能力。


isinstance()

对象检测,可用做类型判断

>>> x = X()
>>> isinstance(x, X) # x 属于 X 这个类吗?
True
>>> isinstance(x, Ancestor) # isinstance 的检测标准包含父类
True
>>> isinstance(x, Cat)
True
>>> isinstance(x, Brid)
True
Python 教程 Python 入门 Python 时间 Python JSON