我在写一个元类,不小心就这样做了:

class MetaCls(type):
    def __new__(cls, name, bases, dict):
        return type(name, bases, dict)

…而不是这样:
class MetaCls(type):
    def __new__(cls, name, bases, dict):
        return type.__new__(cls, name, bases, dict)

这两个元类到底有什么区别?更具体地说,是什么导致了第一个类不能正常工作(一些类没有被元类调用)?

最佳答案

在第一个示例中,您创建了一个全新的类:

>>> class MetaA(type):
...     def __new__(cls, name, bases, dct):
...         print 'MetaA.__new__'
...         return type(name, bases, dct)
...     def __init__(cls, name, bases, dct):
...         print 'MetaA.__init__'
...
>>> class A(object):
...     __metaclass__ = MetaA
...
MetaA.__new__
>>>

在第二种情况下,您正在调用父级的
>>> class MetaA(type):
...     def __new__(cls, name, bases, dct):
...         print 'MetaA.__new__'
...         return type.__new__(cls, name, bases, dct)
...     def __init__(cls, name, bases, dct):
...         print 'MetaA.__init__'
...
>>> class A(object):
...     __metaclass__ = MetaA
...
MetaA.__new__
MetaA.__init__
>>>

关于python - python中类型和类型.__ new__有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2608708/

10-12 20:06