zoukankan      html  css  js  c++  java
  • 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的方式,不管你子类是否重写了父类方法,调用的都是父类方法。

  • 相关阅读:
    NET6 如何使用Windows Service
    Delphi 设置窗体无标题栏和边框
    java MD5 加密 及对应的 oracle数据库中的MD5加密实现
    oracle 查看锁表进程和解锁
    创建dblink 及 同义词
    demjson python key没有引号的字符串如何转json
    Typescript Objects对象
    typescrip 数组、Map、对象方法
    mysql 日期 时间函数
    Typesrcipt日期时间
  • 原文地址:https://www.cnblogs.com/sidianok/p/14182260.html
Copyright © 2011-2022 走看看