正如其他答案所说,一种更简单的方法是将您的属性始终保留为类属性。如果它是在类主体上设置的,并且对该属性的所有写访问都是通过类名而不是实例进行的,则可以:
>>> class Object(object):
... speed = 0
...
>>> a = Object()
>>> b = Object()
>>> c = Object()
>>>
>>> Object.speed = 5
>>> print a.speed
5
>>>
但是,如果您以这种方式在单个实例中设置属性,则该实例将拥有自己的属性,并且它将不再与其他实例的属性一起更改:
>>> a.speed = 10
>>> Object.speed = 20
>>> print b.speed
20
>>> print a.speed
10
>>>
为了克服这个问题,以便每当在任何实例中设置属性时,类属性本身都会发生更改,更简单的方法是将对象作为属性 - 其设置器设置类属性:
class Object(object):
_speed = 0
@property
def speed(self):
return self.__class__._speed
@speed.setter
def speed(self, value):
self.__class__._speed = value
哪个有效:
>>>
>>> a = Object()
>>> b = Object()
>>> a.speed, b.speed
(0, 0)
>>> a.speed = 10
>>> a.speed, b.speed
(10, 10)
如果您想在实例上拥有独立的属性,但需要一个特殊的“set_all”方法来在所有实例中设置该属性,那么方法是使用标准 librayr 中的 gc(垃圾收集器)模块来查找并循环该类的所有实例,并设置它们的实例属性:
import gc
class Object(object):
def __init__(self):
self.speed = 0
def set_all_speed(self, value):
for instance in (obj for obj in gc.get_referrers(self.__class__):
if isinstance(obj, self.__class__)):
instance.speed = value
结果是:
>>> a =Object()
>>> b = Object()
>>> a.speed = 5
>>> b.speed = 10
>>> a.speed, b.speed
(5, 10)
>>> a.set_all_speed(20)
>>> a.speed, b.speed
(20, 20)