以相同方式初始化多个对象而不使它们都指向同一个对象的最干净的方法是什么?我想做这个:
a, b, c = create_object(), create_object(), create_object()
以一种不那么冗长的方式。
我可以执行以下操作,但是我的所有变量都指向同一个对象
a = b = c = create_object() # then a.change() changes them all!
有没有我想念的干净的、pythonic 的方法来做到这一点?
以相同方式初始化多个对象而不使它们都指向同一个对象的最干净的方法是什么?我想做这个:
a, b, c = create_object(), create_object(), create_object()
以一种不那么冗长的方式。
我可以执行以下操作,但是我的所有变量都指向同一个对象
a = b = c = create_object() # then a.change() changes them all!
有没有我想念的干净的、pythonic 的方法来做到这一点?
最Pythonic的代码是最有意义的代码。这样做要好得多
a = create_object()
b = create_object()
c = create_object()
与替代方案相反,混乱的胡言乱语。不要害怕多出两条线;真的,好处要大得多。:-)
使用工厂。
def factory(num):
for i in range(num):
yield shell()
class shell():
pass
a, b, c = factory(3)
# results:
>>> a
<__main__.shell instance at 0x0000000002BE0548>
>>> b
<__main__.shell instance at 0x0000000002BE03C8>
>>> c
<__main__.shell instance at 0x0000000002BE0588>
当然,您可以始终添加额外的参数,以便能够将一组变量初始化为相同,或者您甚至可以拥有复杂的工厂来确定自己的参数以传递给类构造函数。
您也可以将其作为类的静态方法。
无论您的偏好是什么,如果您想将一组变量初始化为同一类的不同实例,那么您应该这样做。(虽然,一般来说,这种活动对于它的价值来说并不是很pythonic ......)
要使用您展示的内容制作工厂并使其更加健壮,这里有一个很好的示例:
def factory(obj, num, args=None):
for i in range(num):
yield obj(args) if args else obj()
a, b, c = factory(create_object, 3)