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