Можно ли обращаться к атрибутам экземпляра в метаклассе?
Вопрос не ради решения какой-то задачи, а просто для понимания. Тестирую всё на таком примере кода:
class MetaUpdate(type):
def __new__(cls, clsname, bases, attrs):
update_attrs = {
attrs if attrs.startswith('__') else attrs.upper(): v for attrs, v in attrs.items()
}
return super(MetaUpdate, cls).__new__(
cls, clsname, bases, update_attrs
)
class MyClass(metaclass = MetaUpdate):
# С атрибутом класса работает
correct = 'Меня видно'
def __init__(self) -> None:
# С атрибутом экземпляра не работает
self.wrong = 'Меня не видно внутри Meta'
a = MyClass()
print(dir(a)) # CORRECT, ......, wrong
Стало интересно. Можно ли обратиться к атрибутам экземпляра внутри метакласса или это технически невозможно из-за того, что __new__ срабатывает перед __init__ и методов атрибута ещё нет?
Ответы (1 шт):
Автор решения: MarianD
→ Ссылка
Как же невидно?
Вы сам видели, что print(dir(a)) вывел на экран тоже ваш атрибут wrong, и когда вы добавите команду
print(a.wrong)
вы получите на экране
Меня не видно внутри Meta