是否有同时设置类的所有实例的变量?我在下面有一个简化的例子:
class Object():
def __init__(self):
self.speed=0
instance0=Object()
instance1=Object()
instance2=Object()
#Object.speed=5 doesn't work of course
我可以看到将所有新实例添加到列表并使用isinstance()进行迭代是可能的,但这是不可取的。
答案 0 :(得分:18)
正如其他答案所说的那样,一种更简单的方法是将属性始终保持为类属性。如果它在类体上设置,并且对该属性的所有写访问都是通过类名而不是实例来实现的:
>>> 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
>>>
为了克服这个问题,每当在任何实例中设置属性时,类属性本身都会被更改,更简单的方法是将对象作为属性 - 其setter设置类属性:
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”方法,那么可以使用标准库栏中的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)
答案 1 :(得分:2)
使用类属性怎么样?
class Object():
speed=0
instance0=Object()
instance1=Object()
instance2=Object()
Object.speed=5
答案 2 :(得分:2)
您可以使用类属性:
class Object():
speed = 0
instance0=Object()
instance1=Object()
instance2=Object()
Object.speed=5
# instance0.speed == instance1.speed == instance2.speed == Object.speed == 5
然而,这意味着所有实例将始终具有相同的speed
。
答案 3 :(得分:0)
“有没有办法同时设置类的所有实例的变量?”
这是一个类属性!
有关如何访问类属性的一些示例:
>>> class Object:
... speed = 5
... @classmethod
... def first(cls):
... return cls.speed
... def second(self):
... return self.speed
...
>>> Object.speed
5
>>> instance = Object()
>>> instance.speed
5
>>> instance.first()
5
>>> instance.second()
5