使用全局MANIFEST进行对象执行。有没有更好的办法?

时间:2011-07-28 14:22:53

标签: python

在尝试跨多个对象执行代码时,我发现自己重复了一个常见的模式。

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]

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

还有其他更好的方法吗?

2 个答案:

答案 0 :(得分:4)

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

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

一个更实际,更少风格的问题是,这个列表将保持该类的每个单个对象永远 。并且他们说人们不能在Python中创建内存泄漏...(这可以通过弱引用来避免,但会使代码更加复杂,以透明地删除死引用。)

解决方案几乎不需要打字,以后会为您节省大量的麻烦。接下来,您将使用局部变量为自己保存return

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

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

答案 1 :(得分: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 s(或任何Run返回),所以你可能会更好地使用正常的{{ 1}}循环。

编辑:内存泄漏问题是一个好点。如果执行此操作,请使用特殊的for方法在删除对象时从列表中删除该对象。

编辑2:实际上,我认为您需要使用__del__方法或其他方法执行此操作,因为在列表中有引用时将永远不会调用close()