TypeError:type()需要1或3个参数

时间:2015-09-07 12:43:48

标签: python

我有一个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__, (), {})

它会起作用! 哪里有问题?

1 个答案:

答案 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__()