我有一个TypeClass来制作Class:
class MyMetaClass(type):
def __new__(cls, *args, **kwargs):
print('call __new__ from MyMetaClass.')
return type(cls.__name__, *args, **kwargs)
但使用时:
Foo= MyMetaClass('Foo', (), {'name':'pd'})
引发错误:
TypeError: type() takes 1 or 3 arguments
如果改变它:
class MyMetaClass(type):
def __new__(cls, *args, **kwargs):
print('call __new__ from MyMetaClass.')
return type(cls.__name__, (), {})
它会起作用! 哪里有问题?
答案 0 :(得分:6)
while
方法在__new__
中传递 3 位置参数;类名,基类和类体。 args
参数绑定到元类,因此此处为cls
。
您正在为该序列添加另一个名称;删除名称,或从MyMetaClass
删除第一个参数:
args
或
class MyMetaClass(type):
def __new__(cls, *args, **kwargs):
print('call __new__ from MyMetaClass.')
return type(*args, **kwargs)
class MyMetaClass(type):
def __new__(cls, *args, **kwargs):
print('call __new__ from MyMetaClass.')
return type(cls.__name__, *args[1:], **kwargs)
参数是元类对象但是,除非您希望调用所有类cls
,否则我会坚持使用第一个选项。
请参阅Python数据模型的Customizing class creation section:
这些步骤必须在元类的
MyMetaClass
方法中执行 - 然后可以从此方法调用__new__()
来创建具有不同属性的类。此示例在创建类之前向类字典添加新元素:type.__new__()
和object.__new__
documentation:
class metacls(type): def __new__(mcs, name, bases, dict): dict['foo'] = 'metacls was here' return type.__new__(mcs, name, bases, dict)
是一个静态方法(特殊的,因此您不需要声明它),它将请求实例的类作为其第一个参数。其余参数是传递给对象构造函数表达式的参数(对类的调用)。
其中要求实例的类是您的元类(生成类对象)。
演示:
__new__()