美文网首页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)更直观一些。

相关文章

  • python 面向对象: super()

    python 关于 super 的使用 子类对象调用父类方法 :super(B,b).hh() 子类中调用父类方法...

  • iOS 小知识点总结

    子类实现父类方法时,监测子类是否调用super方法。 在父类中声明方法时: 子类中实现该父类方法: 图片压缩

  • scala 调用java通过父类调用子类方法实现

    scala 调用java通过父类调用子类方法实现 java 父类 A 抽象类: java 子类 B 继承A类,并...

  • javascript设计模式-抽象工厂模式

    目的:对子类实现进行规范,防止因子类没实现调用了父类的方法,所以当调用父类方法时,抛出异常

  • iOS 父类调用子类的方法

    在子类实现父类的方法,当父类调用子类的方法的时候,就可以了,但是父类也需要实现该方法,我懂了

  • python重要知识点总结一

    内容包含: 元类 python 对象和类的绑定以及类方法,静态方法 python 子类调用父类方法总结 pytho...

  • Python实现子类调用父类方法

    版权所有,如需转载,请联系作者 假设存在类Person与类Student: 运行上面的代码,将会报以下错误: 这是...

  • iOS开发坑01-KVO

    01.UIView 实现了KVO监听回调方法,子类在实现则无法调用父类方法,直接走了父类,需要实现 super调用...

  • Objective-c 子类继承父类私有方法

    笔记: 在OC中 如果子类重写了父类的私有方法,父类不会再调用本类的实现,而是直接调用子类的实现。切记,切记。

  • 继承使用注意

    子类不能定义与父类同名的成员变量 子类可以重写父类的成员方法(覆盖父类的实现) 可以用super指针调用父类的实现...

网友评论

  • 雪拉比: 博主有点小小粗心啊,方法二有两个错误。
    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