Shouldn't __metaclass__ force the use of a metaclass in Python?

前端 未结 3 369
日久生厌
日久生厌 2021-01-18 13:23

I\'ve been trying to learn about metaclasses in Python. I get the main idea, but I can\'t seem to activate the mechanism. As I understand it, you can specify M to be as the

相关标签:
3条回答
  • 2021-01-18 13:41

    In Python 3 (which you are using) metaclasses are specified by a keyword parameter in the class definition:

    class ClassMeta(metaclass=M):
      pass
    

    Specifying a __metaclass__ class property or global variable is old syntax from Python 2.x and not longer supported. See also "What's new in Python 3" and PEP 2115.

    0 讨论(0)
  • 2021-01-18 13:48

    The syntax of metaclasses has changed in Python 3.0. The __metaclass__ attribute is no longer special at either the class nor the module level. To do what you're trying to do, you need to specify metaclass as a keyword argument to the class statement:

    p = print
    
    class M(type):
        def __init__(*args):
            type.__init__(*args)
            print("The rain in Spain")
    
    p(1)
    class ClassMeta(metaclass=M): pass
    

    Yields:

    1
    The rain in Spain
    

    As you'd expect.

    0 讨论(0)
  • 2021-01-18 13:50

    This works as you expect in Python 2.6 (and earlier), but in 3.0 metaclasses are specified differently:

    class ArgMeta(metaclass=M): ...
    
    0 讨论(0)
提交回复
热议问题