Как я могу получить одинаковый доступ к имени класса до и после создания экземпляра? ⇐ Python
-
Гость
Как я могу получить одинаковый доступ к имени класса до и после создания экземпляра?
Я создаю приложение, в котором события определены как классы Python. Каждое событие имеет явный тип, который я задаю в качестве имени класса. У меня есть свойство, определенное в .type, которое позволяет разработчику легко получить к нему доступ. Например:
класс _BaseEvent(BaseModel): @свойство тип определения (сам) -> ул: вернуть self.__class__.__name__ класс NamedEvent(_BaseEvent): данные: ул. До недавнего времени это отлично работало, и теперь мне требовался доступ к имени события еще до инициализации класса. Пытаясь это сделать, я получил неожиданные результаты:
>>> NamedEvent(data=3).type 'ИменованноеСобытие' >>> NamedEvent.type >>> NamedEvent(data=3).__class__.__name__ 'ИменованноеСобытие' >>> NamedEvent.__class__.__name__ 'МодельМетакласс' >>> NamedEvent.__name__ 'ИменованноеСобытие' Есть ли способ создать атрибут, который одинаково возвращает тип события независимо от того, создан ли он или нет? Я понимаю, что могу проверить, создан ли он с помощью isinstance(c, type), но Мне интересно, есть ли у кого-нибудь более чистый способ, не использующий функцию верхнего уровня. > Или вообще, мы будем признательны за любой совет, почему это плохая идея.
Функциональное решение:
def getEventType(c: Type[_BaseEvent] | _BaseEvent) -> str: если isinstance(c, тип): вернуть c.__name__ еще: вернуть c.__class__.__name__ Я читал метаклассы, но сейчас у меня все в голове.
Я создаю приложение, в котором события определены как классы Python. Каждое событие имеет явный тип, который я задаю в качестве имени класса. У меня есть свойство, определенное в .type, которое позволяет разработчику легко получить к нему доступ. Например:
класс _BaseEvent(BaseModel): @свойство тип определения (сам) -> ул: вернуть self.__class__.__name__ класс NamedEvent(_BaseEvent): данные: ул. До недавнего времени это отлично работало, и теперь мне требовался доступ к имени события еще до инициализации класса. Пытаясь это сделать, я получил неожиданные результаты:
>>> NamedEvent(data=3).type 'ИменованноеСобытие' >>> NamedEvent.type >>> NamedEvent(data=3).__class__.__name__ 'ИменованноеСобытие' >>> NamedEvent.__class__.__name__ 'МодельМетакласс' >>> NamedEvent.__name__ 'ИменованноеСобытие' Есть ли способ создать атрибут, который одинаково возвращает тип события независимо от того, создан ли он или нет? Я понимаю, что могу проверить, создан ли он с помощью isinstance(c, type), но Мне интересно, есть ли у кого-нибудь более чистый способ, не использующий функцию верхнего уровня. > Или вообще, мы будем признательны за любой совет, почему это плохая идея.
Функциональное решение:
def getEventType(c: Type[_BaseEvent] | _BaseEvent) -> str: если isinstance(c, тип): вернуть c.__name__ еще: вернуть c.__class__.__name__ Я читал метаклассы, но сейчас у меня все в голове.