Страницы

Поиск по вопросам

вторник, 12 февраля 2019 г.

Метаклассы | Python

Есть следующий код:
def upper_attr(class_name, class_parents, class_attrs): attr = dict((key.upper(), value) for key, value in class_attrs.items() if not key.startswith('__')) return type(class_name, class_parents, attr) class My(object): __metaclass__ = upper_attr var = 'hello world' obj = My() print(hasattr(obj, 'var'))
Ожидаю получить False, так как __metaclass__ переводит названия всех атрибутов в верхний регистр, но получаю True, где я ошибся?
Но если сделать так:
class My(metaclass=upper_attr): ...
То все работает, почему же не работает с __metaclass__ не имею понятия.


Ответ

Код для python3:
class MetaClass(type): def __call__(self, *args, **kwargs): obj = type.__call__(self, *args, **kwargs) for key, value in list(obj.__dict__.items()): if (key[0] == '_') and (key[-1] == '_'): continue else: obj.__dict__[key.upper()] = value del obj.__dict__[key] return obj
class My(object, metaclass=MetaClass): def __init__(self): self.var = 'hello world'
obj = My() print(obj.__dict__) print(hasattr(obj, 'var'))

Комментариев нет:

Отправить комментарий