美文网首页Pythonpython进阶Python 运维
Python实现子类调用父类方法

Python实现子类调用父类方法

作者: nummycode | 来源:发表于2016-04-15 14:08 被阅读2584次

    版权所有,如需转载,请联系作者

    假设存在类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)更直观一些。

    相关文章

      网友评论

      • 雪拉比: 博主有点小小粗心啊,方法二有两个错误。
        1)Person类应当继承自object类
        2)Student中应该是super而不是spuer
        nummycode:今天阅读《Expert python programing》的时候,书中说super in Python 2 works only for new-style classes. The new-style class in Python 2 must explicitly inherit from the object or other new-
        style class:也就是说父类必须显示继承object才行,所以你说的是对的
        nummycode:如果父类为object的话,可以省略不写的,super已经修改,谢谢

      本文标题:Python实现子类调用父类方法

      本文链接:https://www.haomeiwen.com/subject/fednlttx.html