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
对象,这个对象负责进行方法解析,解析过程其会自动查找所有的父类以及父类的父类。
方法一更直观;
方法二可以一次初始化所有超类.
个性签名:时间会解决一切