super在继承的类中使用很多,也很方便。首相申明以下,super是一个类,所以我们在子类中使用super()的时候,它其实是一个super的实例。
这个实例可以使用调用者父类绑定的方法,我自己测试了以下,非常有意思。
这个super能够读取父类的属性,但不能读取父类实例的属性,但在super()实例的__dict__属性里面确已经包含了这个父类的示例属性。
上代码
class Father: class_label = "father_class_label" def __init__(self): self.name = 'sidian' self.age = 18 def run(self): print("wang wang") class Son(Father): def __init__(self): super().__init__() self.son = 'son' def run(self): print("miao miao") def show(self): print(super()) print(super().run) super().run() self.run() print(super().__dict__) print(self.__dict__ is super().__dict__) # 返回True print(super().__dict__['name']) # 就这里会报错,不能读取属性 print(super().name) if __name__ == '__main__': s = Son() s.show()
输出
<super: <class 'Son'>, <Son object>>
<bound method Father.run of <__main__.Son object at 0x7faf2e63e490>>
wang wang
miao miao
{'name': 'sidian', 'age': 18, 'son': 'son'}
True
sidian
Traceback (most recent call last):
File "/Users/shijianzhong/work_space/new_platfrom/platform/smt/test_directory/t9.py", line 35, in <module>
s.show()
File "/Users/shijianzhong/work_space/new_platfrom/platform/smt/test_directory/t9.py", line 31, in show
print(super().name)
AttributeError: 'super' object has no attribute 'name'
输出来看,子类中的super与self的__dict__是相同的对象,但super()对象绑定的方法是子类的父类所有的方法集合,通过super()对象可以在任何时候调用父类的方法。
自己的方法可以通过self.method的方式调用,从上面的示例可以看到super()调用run方法与self调用run方法的不同输出。
但super不能输出属性,虽然在__dict__已经包含了,我个人的理解,super()对象主要是用来传递父类的方法使用,对于属性的调用只能通过self来实现。
super类真是一个有意思的玩意,下次有机会看到进阶的数,再来更新。今天主要学到了,如果想调用父类的方法,务必用super().method的方式,不管你子类是否重写了父类方法,调用的都是父类方法。