Нет универсального, универсального ответа на этот вопрос - это зависит от того, насколько дорогостоящим является создание экземпляра объекта, как часто вы заканчиваете его созданием в лучшем / среднем / худшем случае, а в вашем примере используетсяатрибут класса (вместо атрибута экземпляра), безопасно ли разделять этот объект среди всех экземпляров класса хоста.
Обратите внимание, что к альтернативе есть два других термина:
1/ атрибут для каждого экземпляра, созданный в инициализаторе:
class ScrapySpider():
def __init__(self, *args, **kw):
super().__init__(*args, **kw)
self.api = SomeAPIWrapper()
, который позволяет избежать проблем одновременного доступа, которые могут возникнуть при использовании атрибута класса, и
2 / кэшированное свойство
class ScrapySpider():
@property
def api(self):
if not hasattr(self, "_cached_api"):
self._cached_api = ApiWrapper()
return self._cached_api
, который также предотвращает создание экземпляра ApiWrapper до того, как он понадобится (может быть полезно, если его создание стоит дорого и не всегда необходимо), но добавляет небольшие накладные расходы при доступе к атрибутам.