面向对象--类的继承与重用父类属性或方法

本文详细解析了Python中类的继承机制,包括经典类与新式类的区别,以及它们的继承查找顺序。通过实例展示了如何在子类中重用父类的属性和方法,包括指名道姓和使用super()两种方式。

类的继承
一、类分经典类和新式类
1、在python2中,不带(object)的是经典类,带(object)的是新式类
2、在python3中,带和不带(object)都是新式类
3、经典类 的继承查找顺序是 深度优先
4、新式类 的继承查找顺序是 广度优先

# python3.8.3
class A(object):
    def test(self):
        print('from A')

class B(A):
    def test(self):
        print('from B')

class C(A):
    def test(self):
        print('from C')

class D(B):
    def test(self):
        print('from D')

class E(C):
    def test(self):
        print('from E')

class F(D,E):
    # def test(self):
    #     print('from F')
    pass
f=F()
f.test()
如果F里面没有test()功能的时候,会先从父类D里面查找,D里面没有就去E里面查找
F.mro()    #查看顺序继承
[<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]

重用父类属性或方法

在子类派生出新的方法中重用父类方法,有两种实现方式
1、指名道姓(不依赖继承)

# 指名道姓的方式调用父类功能
class role:
    def __init__(self, name, hurt, life_value):
        self.name = name
        self.hurt = hurt
        self.life_value = life_value
    def attack(self, name):
        name.life_value -= self.hurt
class galen(role):
    camp = 'DE Marcia'
    def __init__(self, name, hurt, life_value, weapon):
        # self.name=name
        # self.hurt=hurt
        # self.life_value=life_value
        role.__init__(self, name, hurt, life_value)  #知名道姓,继承父类功能
        self.weapon = weapon  
    def attack(self, name):
        role.attack(self, name)  # 子类功能中调用父类功能
        print('from galen class')
子类功能中调用父类的功能
class role:
    def __init__(self, name, hurt, life_value):
        self.name = name
        self.hurt = hurt
        self.life_value = life_value
    def attack(self, name):
        name.life_value -= self.hurt
class galen(role):
    camp = 'DE Marcia'
    def attack(self, name):
        role.attack(self, name)  # 这个就是在子类得功能中调用父类功能
        print('from galen class')

2、super() (依赖继承)

class role:
    def __init__(self, name, hurt, life_value):
        self.name = name
        self.hurt = hurt
        self.life_value = life_value
    def attack(self, name):
        name.life_value -= self.hurt
class galen(role):
    camp = 'DE Marcia'
    def attack(self, name):
        # super(galen,self) 括号内第一个参数是自己的类名 逗号 self(对象),这样就可以专门引用父类属性。
        super().attack(name)  # 绑定方法self就可以不用传,python3后 super括号内可以不写,
        print('from galen class')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值