在多个Python实例中更改变量

在多个Python实例中更改变量,第1张

概述反正是否同时设置类的所有实例变量?我在下面有一个简化的例子: class Object(): def __init__(self): self.speed=0instance0=Object()instance1=Object()instance2=Object()#Object.speed=5 doesn't work of course 我可以通过将所有新实例 反正是否同时设置类的所有实例的变量?我在下面有一个简化的例子:

class Object():   def __init__(self):       self.speed=0instance0=Object()instance1=Object()instance2=Object()#Object.speed=5 doesn't work of course

我可以通过将所有新实例添加到列表并使用isinstance()进行迭代来实现,但这是不可取的.

解决方法 正如其他答案所说的那样,一种更简单的方法是将属性始终作为类属性.如果它在类体上设置,并且对该属性的所有写访问都是通过类名而不是实例来实现的:

>>> class Object(object):...     speed = 0... >>> a = Object()>>> b = Object()>>> c = Object()>>> >>> Object.speed = 5>>> print a.speed5>>>

但是,如果您在单个实例中以这种方式设置属性,则实例将具有自己的属性,并且它将不再与其他实例一起更改

>>> a.speed = 10>>> Object.speed = 20>>> print b.speed20>>> print a.speed10>>>

为了克服这个问题,每当在任何实例中设置属性时,类属性本身都会被更改,更简单的方法是将对象作为属性 – 其setter设置class属性:

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 gcclass 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)
总结

以上是内存溢出为你收集整理的在多个Python实例中更改变量全部内容,希望文章能够帮你解决在多个Python实例中更改变量所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/1195753.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存