Python Metaclass не изменил класс при использовании - PullRequest
3 голосов
/ 13 февраля 2012

Я нашел этот вопрос, когда искал использование метакласса в python. Это хороший вопрос с замечательным ответом, См. Здесь . Но пока я следовал примеру, подобному этому:

class UpperAttrMetaclass(type): 

    def __new__(cls, name, bases, dct):

        attrs = ((name, value) for name, value in dct.items() if not name.startswith('__'))
        uppercase_attr = dict((name.upper(), value) for name, value in attrs)

        return type.__new__(cls, name, bases, uppercase_attr)
class Foo(object):
    __metaclass__=UpperAttrMetaclass
    bar = 'bip'

Тогда:

print(hasattr(Foo,'bar'))

Я надеялся, что он выдаст False, но вместо этого True Кажется, метакласс ничего не изменил. Должно быть, я сделал ошибку. Рад, что вы можете указать мне на это!

EDIT: Я использовал IDLE 3.2, чтобы прояснить ситуацию.

EDIT: Спасибо за ответы

Ответы [ 2 ]

5 голосов
/ 13 февраля 2012

Вы не ошиблись. print(hasattr(Foo,'bar')) и print dir(Foo) дайте мне:

False
['BAR', '__class__', ...

Какая у вас версия Python? Мой 2.7.2

Если вы используете Python 3.x, попробуйте удалить атрибут __metaclass__ и объявить ваш класс

class Foo(object, metaclass=UpperAttrMetaclass):
    ...
3 голосов
/ 13 февраля 2012

Что касается ответа @Irfy - в Python 3 способ установить метакласс состоит в том, чтобы передать его так, как если бы он назвал-параметр в объявлении класса - в вашем случае код должен быть:

(В Python 3 также нет необходимости наследовать от объекта)

Также просто используйте «dir» для проверки атрибутов класса, как в dir(Foo).Нет необходимости проверять атрибут за атрибутом с помощью hasattr, когда вы можете видеть их все.

...