4. python 子类调用父类方法

本文介绍了Python中子类如何调用父类的方法,包括两种方式:调用未绑定的父类构造方法和使用`super`函数。通过实例分析了这两种方法的原理和使用场景,帮助理解Python的继承机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假设存在 Person 与 Student 两个类:

class Person(object):
    def __init__(self):
        self.name = "Tom"
    def getName(self):
        return self.name

class Student(Person):
    def __init__(self):
        self.age = 12
    def getAge(self):
        return self.age

if __name__ == "__main__":
    stu = Student()
    print stu.getName()

运行以上代码会报以下错误

Traceback (most recent call last):
  File "test.py", line 18, in <module>
    print stu.getName()
  File "test.py", line 6, in getName
    return self.name
AttributeError: Student instance has no attribute 'name'

报错原因:其他语言(java、php)有所不同,尽管 Student 类继承了 Person 类,但是并没有调用父类的 __init__() 方法,所以在此时子类是不可调用父类的方法的。

方法一:调用未绑定的父类的构造方法

class Person(object):
    def __init__(self):
        self.name = "Tom"
    def getName(self):
        return self.name

class Student(Person):
    def __init__(self):
        Person.__init__(self)
        self.age = 12
    def getAge(self):
        return self.age

if __name__ == "__main__":
    stu = Student()
    print stu.getName()

在调用一个实例的方法时,该方法的 self 参数会被自动绑定到实例上(称为绑定方法)。但如果直接调用父类的方法(比如 Person.__init__()),那么就没有实例会被绑定,这样就可以自由的提供需要的 self 参数,这种方法就称为未绑定方法。

通过将当前的实例作为 self 参数提供给未绑定方法, Student 类就能使用父类构造方法的所有实现,从而 name 变量被设置。

方法二:使用 super 函数

class Person(object):
    def __init__(self):
        self.name = "Tom"
    def getName(self):
        return self.name

class Student(Person):
    def __init__(self):
        super(Student, self).__init__()
        self.age = 12
    def getAge(self):
        return self.age

if __name__ == "__main__":
    stu = Student()
    print stu.getName()

super函数会返回一个super对象,这个对象负责进行方法解析,解析过程其会自动查找所有的父类以及父类的父类。

super函数比在子类中直接调用未绑定方法更直观,但是其最大的优点是如果子类继承了多个父类,它只需要使用一次super函数就可以。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值