python的子类,如何正确的调用父类中的属性
python 子类调用父类方法
方法一 调用未绑定的父类的构造方法
方法二 使用 super 函数
假设存在 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'
报错原因:其他语言(java、php)有所不同,尽管 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 参数,这种方法就称为未绑定方法。
通过将当前的实例作为 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函数就可以。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY