类变量对于不同的实例具有不同的值[重复]

Posted

技术标签:

【中文标题】类变量对于不同的实例具有不同的值[重复]【英文标题】:Class variable have different values for different instances [duplicate] 【发布时间】:2017-04-17 19:51:18 【问题描述】:

我在某处读到“如果 python 找不到实例变量,它将尝试返回具有相同名称的类变量的值”

例如

class Sample:
    pi = 10

现在

x1 = Sample()
x2 = Sample()

x1.pi         # returns 10
x2.pi         # returns 10

x1.pi = 20    # change the value of class variable
x1.pi         # return 20 (OK)
x2.pi         # still returns 10 :(
Sample.pi     # returns 10 :(

发生了什么??

【问题讨论】:

pi 甚至没有在你的类中定义 对不起@lmiuelvargasf 的错字,我编辑了帖子 【参考方案1】:

一旦您在实例上分配了一个名称,它就会获得一个实例属性,该属性会影响类属性。

您可以分配给类属性的唯一方法是分配给类的属性,而不是实例的属性,例如如果你有实例,你需要这样做:

x1.__class__.pi = 20
# If you're on Py3, or on Py2 and x1 is an instance of a new-style class,
# using type(x1) is slightly "nicer" than manually accessing dunder special
# variables, but unfortunately, it doesn't work on old-style class instances
# For new-style class instances though, the following is equivalent:
type(x1).pi = 20

如果您希望与x1 相同类型的所有实例都显示更改。这会从__class__(或通过type 函数)获取类本身,然后分配给它。

如果你不小心创建了一个实例属性,想再次暴露类属性,你可以这样做:

del x1.pi

如果存在名为pi 的实例属性,则将成功,如果不存在raise AttributeError(如果存在则不会删除类属性,您需要执行del x1.__class__.pi/del type(x1).pi 来这样做)。

【讨论】:

注意:这个答案假设类属性真的被命名为pi;您的示例将其命名为 x,然后访问 pi

以上是关于类变量对于不同的实例具有不同的值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥实例变量在闭包内具有不同的值?

2 个具有相同功能但变量名不同的 C++ 类 - 使用哪种模式?

在java中变量和属性有啥不同

ruby中各种变量范围之间的区别

实例变量和类变量的区别

在“java”中变量和属性有啥不同?