【python】Inheritance继承

本文深入探讨Python中类的继承机制,特别是初始化过程。详细解释了当子类没有定义初始化函数时,父类初始化函数的默认调用行为,以及子类如何手动调用父类的初始化函数来确保正确初始化所有属性。
class NamedAnimal:
    def __init__(self, name):
        self.name = name
    
    def __str__(self):
        return "{} {}".format(type(self).__name__, self.name)

    def __repr__(self):
        return "{}('{}')".format(type(self).__name__, self.name)

class Dog(NamedAnimal):
    def __init__(self, name, age):
        # step 1: manually call parent init
        NamedAnimal.__init__(self, name) 
        # step 2: do our own additional init
        self.age = age
    
    def speak(self):
        print("bark")
    
class Cat(NamedAnimal):
    def speak(self):
        print("bark")
        
    def __str__(self):
        return NamedAnimal.__str__(self) + ", string expert"

c = Cat("Kevin")
print(c)
d = Dog("Sam", 1)
print(d)

输出

Cat Kevin, string expert
Dog Sam

从上面可以看出:

  1. 如果子类没有定义自己的初始化函数,那么在构建子类对象时父类的初始化函数会被默认调用,但是在这种情况下,子类的定义参数必须与父类一致,否则会出错。
    比如在定义cat时,如果是c = Cat(“Kevin”, 1),则报错:
    TypeError: init() takes 2 positional arguments but 3 were given

  2. 如果子类定义了自己的初始化函数,则不会自动调用父类的初始化函数,必须要手动传参调用。如果初始化了父类,那么父类和子类的属性都可以被使用。
    比如把Dog中NamedAnimal.init(self, name) 这一句注释掉,再print(d)时会报错:
    AttributeError: ‘Dog’ object has no attribute ‘name’

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值