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

  • 相关阅读:
    读书笔记——吴军《态度》
    JZYZOJ1237 教授的测试 dfs
    NOI1999 JZYZOJ1289 棋盘分割 dp 方差的数学结论
    [JZYZOJ 1288][洛谷 1005] NOIP2007 矩阵取数 dp 高精度
    POJ 3904 JZYZOJ 1202 Sky Code 莫比乌斯反演 组合数
    POJ2157 Check the difficulty of problems 概率DP
    HDU3853 LOOPS 期望DP 简单
    Codeforces 148D. Bag of mice 概率dp
    POJ3071 Football 概率DP 简单
    HDU4405 Aeroplane chess 飞行棋 期望dp 简单
  • 原文地址:https://www.cnblogs.com/sidianok/p/14182260.html
Copyright © 2011-2022 走看看