After reading parts of Django source code, I want to do some test and write codes below to watch how metaclass works:
class MyMeta(type):
def __new__(cls, name, bases, attrs):
print cls, name, bases, attrs
return super(MyMeta, cls).__new__(cls, name, bases, attrs)
class AttrFiled(object): pass
class Test(MyMeta):
name = AttrField()
It always complains:
TypeError: __new__() takes at least 2 arguments (1 given)
And I add modify it as below:
def with_metaclass(meta, *bases): # copied from Django code.
return meta("NewBase", bases, {})
class Test(with_metaclass(MyMeta)):
name = CharField()
and it works.
I also read this What is a metaclass in Python?. But still feel confused.
Thanks in advance !