正如我在此评论中所说的,我将在这里扩展,如果 OP 希望能够X._CON
即时更改,即使在实例化x = X(var)
并且不编写新类之后,那么一种方法可能是创建y
一个属性和var
一个实例属性像这样:
class X(object):
_CON = 0
def __init__(self, var):
self.var = var
@property
def y(self):
return self.var * X._CON
然后 ...
>>> x = X(2)
>>> x.y # returns 0
>>> X._CON = 3
>>> x.y # returns 6
注意:正如其他人指出的那样,我认为 OP 已经发现,此示例使用类属性X._CON
,对类属性的更改将影响该类的所有实例。比如从上面实例化后执行下面x = X(var)
的,值X._CON
还是3;它不会是 0。
请特别注意以下示例中大写类和小实例X
之间的区别:x
>>> x._CON = 23 # <-- doesn't affect x.y b/c x.y = x.var * X._CON
>>> x.y # still returns 6 b/c X._CON = 3 still
>>> x10 = X(10)
>>> x10.y # returns 30 b/c X._CON = 3
>>> x._CON # returns 23
>>> x10._CON # returns 3 since we changed X._CON to 3
>>> X._CON # returns 3 <-- this is the **class** attribute
因此,如果您希望_CON
每个实例的值都特定,请使用self._CON
而不是X._CON
. 重新开始...
class X(object):
_CON = 0
def __init__(self, var):
self.var = var
@property
def y(self):
return self.var * self._CON # <-- use **instance** attribute
然后 ...
>>> x = X(2)
>>> x.y # returns 0
>>> x._CON = 3 # <-- use **instance** attribute
>>> x.y # returns 6
>>> x10 = X(10)
>>> x10.y # returns 0 b/c x10._CON = X._CON = 0
>>> x10._CON = 7 # <-- use **instance** attribute
>>> x10.y # returns 70
>>> x._CON # returns 3
>>> x10._CON # returns 7
>>> X._CON # returns 0
还有一些变体,例如实例属性会发生什么,x._CON
以及x10._CON
在第二个示例中,self._CON
如果您X._CON
在设置实例属性之前或之后更改类属性x._CON
或x10._CON
. 我会把这些例子留给读者去探索。