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中,不会打印任何内容。假设您不能更改BaseMeta和Service类,您将如何修改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)