携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情
0 环境
- 编辑器:pycharm或者vscode
- 系统版本:windows10
- python版本:3.9.6
1 类变量和实例变量
类变量的定义是:类的直接下级作用域,被称为是类变量。关联到实例的变量就是实例变量。如下代码:NAME是类变量,而这里的name是实例变量,当我分别用类和实例对象访问NAME(类变量)时,都是会正常打印出A的结果的。也就说明:类变量对于类和实例对象都是可用的。但是当我使用类直接引用实例变量的时候,就会发生该name没有定义的。注释掉Demo.name,再次运行,实例对象是可以拿到name的值的。
class Demo:
NAME = "A"
def __init__(self, name):
self.name = name
if __name__ == '__main__':
d = Demo("a")
print(Demo.NAME)
print(d.NAME)
print(Demo.name)
print(d.name)
2 作用域
在上面的代码基础上添加了如下的代码: 还是结合上面代码的例子,我新创建了一个新的实例叫d1,该实例访问类变量的结果也是A,是不是可以得出一个结论:所有实例其实是共享类变量的,或者理解为公用类变量。
print("--------d1-------")
d1 = Demo("b")
print(Demo.NAME)
print(d1.NAME)
print(d1.name)
d1.NAME = "B"
print(d1.NAME)
print(d.NAME)
那么有个问题来了,那么类变量的值,我实例可以修改?看上去是可以赋值修改的(d1.NAME = "B"),也是可以打印出结果的,但是我用其他实例或类打印这个类变量,结果是不同的。
那我在随意添加个属性呢,d1.AGE = 12。侧面讲,python是可以自定义对象的加减属性的。按照上面d1.NAME的结果,是不是说明了,d1的NAME其实它的实例,是自己创建的属性,然后覆盖的类变量。