在尝试跨多个对象执行代码时,我发现自己重复了一个常见的模式。
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]
这是一种模式(或反模式)吗?或者只是我编造的东西?
还有其他更好的方法吗?
答案 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()
。