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