Python 3中基元类init函数的隐式调用

Python 3中基元类init函数的隐式调用,python,metaprogramming,metaclass,Python,Metaprogramming,Metaclass,代码如下: class BaseMeta(type): def __init__(self, cls_name, cls_bases, cls_dict): super(BaseMeta, self).__init__(cls_name, cls_bases, cls_dict) print("BaseMeta init") print(cls_dict) class Proxy(): class __meta

代码如下:

class BaseMeta(type):
    def __init__(self, cls_name, cls_bases, cls_dict):
        super(BaseMeta, self).__init__(cls_name, cls_bases, cls_dict)
        print("BaseMeta init")
        print(cls_dict)

class Proxy():
    class __metaclass__(BaseMeta, type):
        def __new__(cls, name, bases, dict):
            return type.__new__(cls, name, bases, dict)

        def __init__(cls, name, bases, dict):
            print("Proxy init")
            BaseMeta.__init__(cls, name, bases, dict)

class Service(Proxy):
    def some_endpoint(self, a):
        print(a)
在Python 2中运行时,输出类似于:

Proxy init
BaseMeta init
{'__module__': '__main__', '__metaclass__': <class '__main__.__metaclass__'>}
Proxy init
BaseMeta init
{'some_endpoint': <function some_endpoint at 0x8011e35d0>, '__module__': '__main__'}
代理初始化
BaseMeta初始化
{''''''''''''''''''''''''''''''''''''''.'元类'.''.'':}
代理初始化
BaseMeta初始化
{'some_endpoint':,'u_模块:''u__':''u____'main}
BaseMeta init在脚本init上被隐式调用(两次)_


在Python3中,不会打印任何内容。假设您不能更改BaseMetaService类,您将如何修改Proxy类,以便您可以看到类似于Python3中上述输出的输出?谢谢。

问题是
\uMetClass\uuuuuuu
在python中不再具有任何特殊状态hon 3.通常,指定元类就像在类定义语句中指定参数一样:

class Foo(metaclass=FooMeta):
    ...
您可以这样做:

class BaseMeta(type):
    def __init__(self, cls_name, cls_bases, cls_dict):
        super(BaseMeta, self).__init__(cls_name, cls_bases, cls_dict)
        print("BaseMeta init")
        print(cls_dict)

class ProxyMeta(BaseMeta):
    def __new__(cls, name, bases, dict):
        return type.__new__(cls, name, bases, dict)
    def __init__(cls, name, bases, dict):
        print("Proxy init")
        BaseMeta.__init__(cls, name, bases, dict)

class Proxy(metaclass=ProxyMeta):
    pass

class Service(Proxy):
    def some_endpoint(self, a):
        print(a)