Python实现子类调用父类方法

转载自https://www.jianshu.com/p/dfa189850651

这里是说在类定义里调用,而不是指实例的调用。

假设存在类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'

这是因为尽管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参数,这种方法称为未绑定方法。

方法二:使用super函数

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

class Student(Person):
    def __init__(self):
        # Person.__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对象,这个对象负责进行方法解析,解析过程其会自动查找所有的父类以及父类的父类。

方法一更直观;

方法二可以一次初始化所有超类.

posted @ 2020-03-31 21:56  Rogn  阅读(6466)  评论(0编辑  收藏  举报