🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
定义 ---- 属性其实就是类命名空间下的一个变量,故其定义规则同普通变量定义规则: - 属性名:字母(a-zA-Z)、数字、下划线`_`,数字不能开头 - 初始化时,必须赋值;可以是直接量或表达式。 Python一切皆对象,属性、方法其实均是类命名空间下的变量。属性、方法/函数其实是互通的。 ~~~ # 属性b、c其实是类方法、静态方法 class Demo: a = 1 def b(cls, *args, **kwargs): pass b = classmethod(b) def c(*args, **kwargs): pass c = staticmethod(c) ~~~ Python中有两种属性: **类属性**:类.属性 **实例属性**:实例.属性 查找、设置 ----------------- #### 属性查找: 类似于变量在作用域中的查找,类属性 > 实例属性 实例属性不存在时,会向上查找类属性的值作为实例属性 #### 属性设置: 类对象和实例对象是两个独立的对象。 类属性 通过类设置:类.属性 = xxx || cls.属性 = xxx 实例属性 通过实例设置:实例.属性 = xxx || self.属性 = xxx #### 即: 1. Python中的类和实例是两个完全独立的对象; 2. Python中属性的查找是按照从下到上的顺序来查找属性; 3. Python中的属性设置是针对对象本身进行的; 属性的修改 与 向上查找: ~~~ class Demo: a = 0 def instance_method(self): self.a = 'instance-property' @classmethod def class_method(cls): cls.a = 'class-property' ins = Demo() # 实例方法 修改 实例属性 ins.instance_method() print(Demo.a, ins.a) # 0 instance-property # 修改 实例.属性 ins.a = 2 print(Demo.a, ins.a) # 0 2 # 类方法 修改 类属性 ins.class_method() print(Demo.a, ins.a) # class-property 2 # 修改 类.属性 Demo.a = 3 print(Demo.a, ins.a) # 3 2 # 删除实例属性:实例属性的查找会取类属性值 del ins.a print(Demo.a, ins.a) # 3 3 ~~~ 实例a、实例b、对象A 相互独立; 类属性、实例属性 相互独立; 属性的向上查找: ~~~ class A: a = 10 a = A() b = A() print(a.__dict__, b.__dict__) # {} {} print(a.a, b.a, A.a) # 10 10 10 a.a += 2 print(a.a, b.a, A.a) # 12 10 10 A.a += 3 print(a.a, b.a, A.a) # 12 13 13 ~~~