super的日常使用小记.

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的方式,不管你子类是否重写了父类方法,调用的都是父类方法。

原文地址:https://www.cnblogs.com/sidianok/p/14182260.html