• Python笔记 · Python语言的“动态性”


    尽管对于Python程序员来说已经司空见惯,但是当那些从非动态语言转过来的程序员初次看到形如self.xxx=xxx的语句就是在定义对象属性时往往会感到“离奇”:一个未经声明的(类似private int a;那样)变量,直接从self中“点”出来,后面跟一个赋值就同时完成了“添加属性”并“为其赋值”的二合一操作。这其中,当属self.这个操作最能体现Python的“动态性”了:当我们要“.”的时候,就是直接要给对象添加属性或方法了,没有预先的类成员声明(类似private int a;那样),在任何时候,直接“.”一个属性,就是添加了一个属性,这就是“动态”的实际表现。

    鉴于Python动态添加属性/方法的特点,如果想做到静态语言中声明类成员变量的效果,最恰当的时机就是在__init__方法中使用self.xxx=xxx的形式添加类成员,因为__init__是在对象实例化时最先被调用的方法,在该方法中创建的类成员,其声明周期与静态语言中声明的类成员大致相同。下图展示了这一常见的情形,对于self.num = num再次解释一遍:它做了两件事情:先是通过self.num给Test类动态添加出了一个成员变量num,其次才是将传入的num参数的值赋给它:在这里插入图片描述上述是用比较“感性”的方式描述了一下Python语言的“动态性”。如果仔细思考一下,不难看出,在类成员(包括方法和属性)的创建上,Python的“动态性”是一以贯之的,所有类成员都可以认为是动态添加的,且在对象的全生命周期中可以随时添加或修改新的成员。通俗一点说就是:在类定义期,即类的内部,我们使用self.xxx=xxx形式给类动态添加成员,在对象被实例化出来之后,我们可以继续使用your-object.xxx=xxx形式给类动态添加成员。下面这个例子结合“私有方法”这个知识点设计了一个示例来演示如何动态添加字段,代码中还加了一个“弯”:

    class A():
        def __init__(self):
            self.__num = 200
    
        def num1(self):
            return self.__num
    
        def num2(self,num):
            if num < 999:
                self.__num = num
    
        num = property(num1,num2)
    
    a = A()
    # 若此时打印a.__num会报: 'A' object has no attribute '__num'
    # print(a.__num)
    a.__num = 300
    # 此时再打印就不会了,因为a.__num = 300这一行为A动态添加了__num属性!
    print(a.__num)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    参考:

    https://codeantenna.com/a/RKRWiPzNXD

    https://pynative.com/python-instance-variables/

    https://blog.51cto.com/u_13800449/3013049

  • 相关阅读:
    Huggingface初上手即ERNIE-gram句子相似性实战
    Excel必备!6种快速插入√或x标记的方法揭秘
    oracle 自定义函数(非常简单明了)
    java基于springboot+vue的地铁公交交通线路查询系统
    11.9 - 每日一题 - 408
    “突然降级到 iPhone 11 Pro Max 的我,好像……也没有错过什么?”
    Adobe Premiere基础-声音调整(音量矫正,降噪,电话音,音高换挡器,参数均衡器)(十七)
    3D游戏建模学习路线
    C++11(二)右值引用与移动语义+完美转发
    【软考 系统架构设计师】数据库系统② 分布式数据库
  • 原文地址:https://blog.csdn.net/bluishglc/article/details/128143683