最近项目中的多个APP的很大部分类的代码相似,少许的不同,于是将重复部分抽象为一个基类,其他APP中要用到的直接继承基类,基于此重复习继承。
- 单继承:
子类继承了父类的func方法,并直接调用,如果子类中存在相同的方法名,则优先调用子类中的方法
class Father:
def func1(self):
print('这是父类的方法')
def func2(self):
print('这是父类的方法')
class Son(Father):
"""继承了Father的方法"""
def func2(self):
print('子类改写了从父类继承的的方法')
s = Son()
s.func1() # 结果:这是父类的方法
s.func2() # 结果:和父类方法名相同,优先调子类中的方法
- 抽象基类:
抽象基类必须继承abc.ABC,如果在基类的方法中使用了@abc.abstracmethod装饰器则表示为子类必须实现的方法,否则会报错
import abc
class Father(abc.ABC):
@abc.abstractmethod
def func1(self):
print('这是父类的方法')
class Son(Father):
"""继承了Father的方法"""
s = Son()
s.func1()
# 报错:
# Traceback (most recent call last):
# File "/Users/futianwen/Desktop/流畅的Python/demo.py", line 14, in <module>
# s = Son()
# TypeError: Can't instantiate abstract class Son with abstract methods func1
class Father(abc.ABC):
@abc.abstractmethod
def func1(self):
print('这是父类的方法')
class Son(Father):
"""继承了Father的方法"""
def func1(self):
print('实现此方法后不再报错')
s = Son()
s.func1() # 结果:实现此方法后不再报错
- 多继承:
在多继承中如果两个父类都用了同一个方法名,子类会如何继承?调用子类的mro方法,按列表中的顺序执行
class Father1:
def func1(self):
print('这是父类1中的func1方法')
class Father2:
def func1(self):
print('这是父类1中的func1方法')
class Son(Father1, Father2):
""""""
s = Son()
s.func1() # 这是父类1中的func1方法
print(Son.mro()) # [<class '__main__.Son'>, <class '__main__.Father1'>, <class '__main__.Father2'>, <class 'object'>]
通过调用子类的mro方法可以看到列表[<class ‘main.Son’>, <class ‘main.Father1’>, <class ‘main.Father2’>, <class ‘object’>],调用顺序也是按此列表,最优先是子类本身,其次才是父类,这也说明了为什么在单继承中子类方法和父类同名时会优先调用子类中的
- 如果子类和父类方法同名,但是又想调用父类的这个同名方法使用super()
class Father:
def func1(self):
print('这是父类中的func1')
class Son(Father):
def func1(self):
print('这是子类中的func1')
super().func1()
s = Son()
s.func1()
# 结果:
# 这是子类中的func1
# 这是父类中的func1