Python实现子类调用父类方法
2016-04-15 本文已影响2584人
nummycode
版权所有,如需转载,请联系作者
假设存在类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
参数,这种方法称为未绑定unbound
方法。
通过将当前的实例作为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
函数就可以。然而如果没有这个需求,直接使用Person.__init__(self)
更直观一些。