Python中的继承

本文介绍了Python中的继承概念,包括单继承、抽象基类的使用,以及多继承时的方法调用规则。通过实例展示了如何在子类中调用父类方法,以及如何处理同名方法的优先级问题。
摘要由CSDN通过智能技术生成

最近项目中的多个APP的很大部分类的代码相似,少许的不同,于是将重复部分抽象为一个基类,其他APP中要用到的直接继承基类,基于此重复习继承。

  1. 单继承:
    子类继承了父类的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()  # 结果:和父类方法名相同,优先调子类中的方法
  1. 抽象基类:
    抽象基类必须继承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()  # 结果:实现此方法后不再报错
  1. 多继承:
    在多继承中如果两个父类都用了同一个方法名,子类会如何继承?调用子类的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’>],调用顺序也是按此列表,最优先是子类本身,其次才是父类,这也说明了为什么在单继承中子类方法和父类同名时会优先调用子类中的

  1. 如果子类和父类方法同名,但是又想调用父类的这个同名方法使用super()
class Father:
    def func1(self):
        print('这是父类中的func1')


class Son(Father):
    def func1(self):
        print('这是子类中的func1')
        super().func1()


s = Son()
s.func1()
# 结果:
# 这是子类中的func1
# 这是父类中的func1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值