我最近在Python中看到了很多以下模式:
class Foo: pass
class Bar:
foo_class = Foo
def __init__(self):
self.foo = self.foo_class()
据我了解,Bar
类首先创建对Foo
类的引用作为类变量foo_class
,然后在{{1 }}。除了直接在Foo
中实例化__init__
之外,它还有什么优点?
Foo
答案 0 :(得分:3)
有一些小好处,因为您不再在无法更改的地方对Foo
的引用进行硬编码。在第一个示例中,如果希望Bar.foo_class
的后续实例使用Bar
以外的其他值,则可以更改Foo
的值。在第二个示例中,没有简单的方法可以做到这一点。
一种甚至更好的方法是将__init__
本身参数化以接受要使用的类。 class属性只是默认值:
class Bar:
foo_class = Foo
def __init__(self, foo_class=None):
if foo_class is None:
foo_class = self.foo_class
self.foo = foo_class()
如果foo_class
仅使用__init__
,则可以完全省去class属性,并设置该参数的默认值。
class Bar:
def __init__(self, foo_class=Foo):
self.foo = foo_class()
(如果Bar.foo_class
之外使用__init__
,则可能需要确保创建的self.foo
没有任何问题使用可能不同的类。)