Есть следующий код:
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'))
Комментариев нет:
Отправить комментарий