Создайте ссылки на классы в переменных класса и создайте их экземпляры в __init__ - PullRequest
2 голосов
/ 22 марта 2019

Я недавно видел довольно много следующего шаблона в Python:

class Foo: pass

class Bar:
    foo_class = Foo

    def __init__(self):
        self.foo = self.foo_class()

Как я понимаю, класс Bar сначала создает ссылку на класс Foo как переменную классаfoo_class, а затем создает экземпляр Foo в __init__.Есть ли в этом какие-то преимущества вместо того, чтобы просто создавать Foo непосредственно в __init__?

class Foo: pass

class Bar:
    def __init__(self):
        self.foo = Foo()

1 Ответ

3 голосов
/ 22 марта 2019

Есть небольшое преимущество, так как вы больше не пишете ссылку на 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, созданным с использованием, возможно, другого класса.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...