如何一次更改班级的所有对象?

时间:2014-07-18 07:19:24

标签: python oop

我正在通过我正在编写的GUI应用程序重新发现OOP,并且想要了解是否可以更改从类中实例化的所有对象的特征。我有以下代码:

class myclass():
    def __init__(self):
        self.a = 1

x = myclass()
y = myclass()
print x.a, y.a  # outputs 1 1
# the instruction I am looking for, assigns 2 to a in each object at once
print x.a, y.a  # outputs 2 2

我正在寻找的是通过操纵父类来一次更改xy的方法。 我知道我可以使用修改self.a 的方法 - 我不想使用它,因为这意味着我必须为每个对象单独调用它。

我的直觉是,这是不可能的,我必须巧妙地处理我的对象以简化这些活动(例如,通过将它们存储在我将循环的列表中,应用方法)。我只是不想错过一个我不知道的机制,它会大大简化我的代码。

2 个答案:

答案 0 :(得分:1)

不,你不能。在没有指向对象的指针的情况下,不能更改对象数据。可能你需要类变量和classmethod

class myclass:
  a = 1
  @classmethod
  def set_a(cls, val):
    cls.a = val

x = myclass()
y = myclass()
print x.a, y.a  # outputs 1 1
myclass.set_a(2)
print x.a, y.a  # outputs 2 2

但在这种情况下,您无法单独更改对象的a值。如果您想要这样的行为,可以在classdata中保存所有对象实例,如下所示:

class myclass:

  objects = []

  def __init__(self):
    self.a = 1
    # add instantiated object to object list 
    self.__class__.objects.append(self)

  @classmethod
  def set_all(cls, val):
    # go through list and change each object
    for obj in cls.objects:
      obj.a = 2

x = myclass()
y = myclass()
print x.a, y.a  # outputs 1 1
myclass.set_all(2)
print x.a, y.a  # outputs 2 2
# and you cat change data of each object separately:
x.a = 3
print x.a, y.a  # outputs 3 2

答案 1 :(得分:0)

class myclass():
    a=10
    def __init__(self):
        self.b=0

a=myclass()
b=myclass()
print a.a,b.a #output 10,10
myclass.a=2
a=myclass()
b=myclass()


print a.a,b.a #output 2,2