前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python实现子类调用父类方法

Python实现子类调用父类方法

作者头像
用户2936342
发布2018-08-27 15:04:09
3.1K0
发布2018-08-27 15:04:09
举报
文章被收录于专栏:nummynummy

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

假设存在类Person与类Student:

代码语言:javascript
复制
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()

运行上面的代码,将会报以下错误:

代码语言:javascript
复制
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__()方法,那么怎样调用父类的方法呢? 有如下两种解决方案:

方法一:调用未绑定的父类构造方法

代码语言:javascript
复制
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函数

代码语言:javascript
复制
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)更直观一些。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016.04.15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 方法一:调用未绑定的父类构造方法
  • 方法二:使用super函数
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档