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



具有以下代码:

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-init在脚本init上被隐式调用(twice_

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

问题是__metclass__在Python 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)

最新更新