Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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 metaclass when constructing a class K by setting __metaclass__ to M at the global or class level. To test this out, I wrote the following program:

p = print

class M(type):
    def __init__(*args):
        type.__init__(*args)
        print("The rain in Spain")

p(1)
class ClassMeta:
    __metaclass__ = M

p(2)
__metaclass__ = M
class GlobalMeta: pass

p(3)
M('NotMeta2', (), {})

p(4)

However, when I run it, I get the following output:

C:\Documents and Settings\Daniel Wong\Desktop>python --version
Python 3.0.1

C:\Documents and Settings\Daniel Wong\Desktop>python meta.py
1
2
3
The rain in Spain
4

Shouldn't I see "The rain in Spain" after 1 and 2? What's going on here?

like image 777
allyourcode Avatar asked May 04 '09 01:05

allyourcode


2 Answers

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.

like image 155
sth Avatar answered Sep 18 '22 12:09

sth


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

class ArgMeta(metaclass=M): ...
like image 36
Alex Martelli Avatar answered Sep 18 '22 12:09

Alex Martelli