Это не «немного неправильно» - это простой и очевидный способ сделать это.
Одна строка кода, понятная каждому и очевидная "что это такое".
Тем не менее, это не "чувствовать" элегантно.
Итак, если вы не хотите делать это только для внешнего вида, и, возможно, если есть много таких классов, не повторяющих код, это можно сделать с помощью декоратора классов:
def instance_as_member(attr_name='instance_as_member', *init_args, **init_kwargs):
def decorator(cls):
instance = cls(*init_args, **init_kwargs)
setattr(cls, attr_name, instance)
return cls
return decorator
@instance_as_member()
class MyClass:
...
Декораторы в порядке, так как они получают cls для модификации как parmater после того, как он полностью создан. С метаклассами это было бы сложно, потому что некоторые шаги создания экземпляров класса, такие как вызов __init_subclass__
, выполняются после любых явных методов метакласса, которые могут быть переопределены, поэтому могут возникнуть проблемы при попытке создать экземпляр внутри метод инициализации метакласса (__init__
, __new__
или метамета-класс '__call__
)