2011-07-28 41 views
1

当我试图跨多个对象执行代码时,我发现自己重复了一个常见模式。使用全局MANIFEST进行对象执行。有没有更好的办法?

Arg_list_one = ["first","second", "so on"] 
Arg_list_two = ["first","second", "so on"] 


MANIFEST = [ ] 

class connection(object): 
    def __init__(self, args): 
     ... 
     MANIFEST.append(self) 
    def Run(self): 
     ... 

connection(Arg_list_one) 
connection(Arg_list_two) 

[conn.Run() for conn in MANIFEST] 

这是一个模式(或反模式)?或者只是我编造的东西?

还有其他更好的方法吗?

回答

4

为什么你需要一个有史以来创建的所有对象的列表?其中许多可能属于您的应用程序完全不相关的部分!给定的一段代码不应该认为它是唯一一个使用类的人。特别是因为通常不需要:

  • 函数创建一堆对象,然后对所有对象执行一些操作?将对象放入临时的本地范围列表中。
  • 需要在函数之间共享一些对象吗?把它们放在一个列表中,将列表传递给应该看到对象的人。
  • 某些类的实例共享这些对象中的某些对象?制作一份清单并将其放入课堂。
  • 等等,你会看到这是怎么回事。

更实际和少文体的问题是,这个名单会保持每一个对象,它是有史以来实例化活着永远该类。他们说,不能在Python中创建内存泄漏...(这可以通过弱引用避免,但会使代码更加复杂,以便透明地删除死引用。)

该解决方案几乎没有更多的输入和以后可以为你节省很多麻烦。接下来,您将使用本地变量为自己节省return

connections = [Connection(arg_list_one), Connection(arg_list_two)] 
for connection in connections: 
    connection.run() 

这就是说,可能存在这样的列表可以是(与所述内存泄漏的修复,当然)有用的情况。我只是没有看到任何与你的例子接近的东西,我认为这种情况非常罕见。

+0

内存泄漏......我更喜欢称之为非确定性扩展。感谢您的解释。我以为我做错了(我的第一个暗示是我正在使用全局变量)。 –

1

我建议将清单移入类中。如果它真的被用作类变量,那就把它变成一个。

class connection(object): 
    MANIFEST = [ ] 
    def __init__(self, args): 
     ... 
     self.MANIFEST.append(self) 
    def Run(self): 
     ... 
    @classmethod 
    def RunAll(cls): 
     for conn in cls.MANIFEST: 
      conn.Run() 

connection(Arg_list_one) 
connection(Arg_list_two) 

conn.RunAll() 

此外,如果有大量的对象,你的方法聚集的None秒(或任何Run回报)一个长长的清单,所以你可能有一个正常的for循环更好。

编辑:内存泄漏问题是一个好点。如果这样做,请使用特殊的__del__方法删除列表中的对象。

编辑2:其实,我认为你需要在close()方法中做到这一点,因为__del__永远不会被调用,而列表中有一个引用。

+0

我不得不查看@classmethod装饰器,这在这个例子中非常有用。 –

相关问题