假设我想使用类变量在对象之间实现公共变量(类似于Java/c++中的静态变量).

当我使用Object访问类变量时,它显示缺省值. 然后我通过对象更新了类变量,它不更新其他对象的类变量. 当通过其他对象或类名直接访问类变量时,它在中显示旧值.

为什么会这样,以及在Python中使类/静态变量(对象通用)的方法是什么

# Class for Computer Science Student
class CSStudent:
    
    stream = 'cse'               # Class Variable
    def __init__(self,name):
        self.name = name     # Instance Variable

# Objects of CSStudent class
a = CSStudent('Geek')
b = CSStudent('Nerd')


print(a.stream) # prints "cse"
print(b.stream) # prints "cse"
print(a.name) # prints "Geek"
print(b.name) # prints "Nerd"

# Class variables can be accessed using class
# name also
print(CSStudent.stream) # prints "cse"

# Now if we change the stream for just a it won't be changed for b
a.stream = 'ece'
b.stream = 'abc'
print(CSStudent.stream)  # prints 'ece'
print(a.stream) # prints 'ece'
print(b.stream) # prints 'abc'

推荐答案

你需要知道查找程序.

首先,实例和类都有自己的命名空间.只有类变量在所有实例之间共享.类和实例的命名空间可以通过__dict__属性访问.

当您从实例访问属性时,Python首先查看实例的名称空间,如果它可以找到它,它就会返回它,否则它将在它的类中找到它!

class CSStudent:
    stream = "cse"

a = CSStudent()
b = CSStudent()
print("stream" in a.__dict__)          # False
print("stream" in b.__dict__)          # False
print("stream" in CSStudent.__dict__)  # True

print(a.stream)  # cse
print(b.stream)  # cse

所以ab没有stream,只有班级有.

现在,a.stream = "something"会将该属性添加到该特定实例的名称空间中.

a.stream = "something"
print("stream" in a.__dict__)          # True
print("stream" in b.__dict__)          # false
print("stream" in CSStudent.__dict__)  # True

现在,如果您访问a.stream,它会在a的名称空间中找到它并返回它,但是因为b没有它,它会在类中找到它.(共享的那个)

print(a.stream)  # something
print(b.stream)  # cse

如果想要更改以反映所有实例,则需要在所有实例之间共享它的类上更改它.

class CSStudent:
    stream = "cse"

a = CSStudent()
b = CSStudent()
print(a.stream)     # cse
print(b.stream)     # cse
CSStudent.stream = "something"
print(a.stream)     # something
print(b.stream)     # something

总是想着谁拥有什么.然后考虑优先级,首先判断实例名称空间.

Note:我简化了解释,没有提到descriptors是什么,因为我们这里没有.以后再来看看吧.您会惊讶地发现,实际上总是首先判断类名称空间!

Python相关问答推荐

如何在where或过滤器方法中使用SQLAlchemy hybrid_Property?

两极按组颠倒顺序

使用Python和PRNG(不是梅森龙卷风)有效地生成伪随机浮点数在[0,1)中均匀?

已删除的构造函数调用另一个构造函数

将numpy矩阵映射到字符串矩阵

在使用Guouti包的Python中运行MPP模型时内存不足

Polars:使用列值引用when / then表达中的其他列

在内部列表上滚动窗口

替换字符串中的多个重叠子字符串

比较2 PD.数组的令人惊讶的结果

如何获取TFIDF Transformer中的值?

SQLAlchemy Like ALL ORM analog

ThreadPoolExecutor和单个线程的超时

有没有一种ONE—LINER的方法给一个框架的每一行一个由整数和字符串组成的唯一id?

不能使用Gekko方程'

使用Python和文件进行模糊输出

lityter不让我输入左边的方括号,'

Python全局变量递归得到不同的结果

如何排除prefecture_related中查询集为空的实例?

基于另一列的GROUP-BY聚合将列添加到Polars LazyFrame