元类化,定义__init__以使用字典传递实例(不是类)的属性

时间:2013-06-04 12:38:08

标签: python dictionary metaclass kwargs

同样to this question我想将字典中的属性传递给类的实例,但是使用type创建类,如下所示:

attrs = { 'name': 'Oscar', 'lastName': 'Reyes', 'age':32 }

e = type('Employee', (object,),attrs)()

但是当我这样做时,属性属于类,不仅仅属于实例。如果我使用:

创建两个实例
e = type('Employee', (object,), attrs)()
f = type('Employee', (object,), attrs)()

他们实际上是两个不同的类。

我想在**kwargs中创建一个接受*args__init__()的课程,例如:

class Employee(object):
    def __init__(self, *args, **kwargs):
        self.args = args
        for k,v in kwargs.items():
            setattr(self, k, v)

使用type()。那样:

MyClass = type('Employee', (object,), {})

允许:

e = MyClass( **kwargs )

1 个答案:

答案 0 :(得分:3)

没问题。您只需编写该函数并将其包含在您传递到密钥type

下的'__init__'的字典中
def func(self,*args,**kwargs):
    self.args = args
    for k,v in kwargs.items():
        setattr(self,k,v)

MyClass = type('Employee',(object,),{'__init__':func})
e = MyClass(name='john')
print (e.name) #'john'

当你完成创建课程时,你甚至可以“删除”func,如果它让你对保持命名空间清晰感觉更好:

MyClass = type('Employee',(object,),{'__init__':func})
#clean up, clean up, everybody everywhere, clean up clean up, everybody do your share ...
del func