2017-01-13 9 views
0

Я пытаюсь понять метаклассы.metaclass `__call__` метод, не вызываемый при instanciation

я уже читал this answer и я пытался использовать пользовательские __call__ так:

#!/usr/bin/env python3                        

class MetaTest(type): 
    def __call__(cls, *args, **kwargs): 
     print("MetaTest.__call__ called.") 
     return super().__call__(cls, *args, **kwargs) 


class Test: 
    __metaclass__ = MetaTest 


if __name__ == '__main__': 
    Test() 

я ожидал Test.__class__.__call__ называться в создании экземпляра, и Test.__class__ быть экземпляром MetaTest, но это не так, поскольку У меня нет вывода при запуске этого скрипта.

So Почему не MetaTest.__call__ позвонил по номеру Test instanciation?

+1

Это не правильный синтаксис для использования метакласса в Python 3.x: https://docs.python.org/3.0/whatsnew/3.0.html#changed-syntax. Если вы исправите это, вы увидите, что метод get вызывается, как ожидалось. – jonrsharpe

+0

@jonrsharpe Действительно! Я исправил его и вызывается '__class __.__ call__'. Все еще есть ошибка, но это другой вопрос, этот решается :). – vmonteco

ответ

1

Вы используете синтаксис Python 2 для метаклассов - но ваш притон линия и метки указуют вы работаете его на Python 3.

Просто измените объявление класса объявить метакласс с помощью Python»3 пути:

#!/usr/bin/env python3                        

class MetaTest(type): 
    def __call__(cls, *args, **kwargs): 
     print("MetaTest.__call__ called.") 
     return super().__call__(cls, *args, **kwargs) 


class Test(metaclass=MetaTest): 
    pass 

if __name__ == '__main__': 
    Test() 

Объявление атрибута __metaclass__ на тело класса не влияет на Python 3-, но поскольку это просто объявление атрибута, оно также не вызывает ошибок.