在类变量中创建对类的引用,并在__init__中实例化它们

时间:2019-03-22 13:14:38

标签: python oop

我最近在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

1 个答案:

答案 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没有任何问题使用可能不同的类。)