如何定义具有动态属性的类?

时间:2020-01-17 14:40:20

标签: python class-attributes

在我的项目中,我需要创建一个类,其属性由dict传递,如下所示:

class_attributes = {"sensor": Nested(Sensor),
                    "serial_interface": Nested(SerialInterface)}
class MSchema(marshmallow.ModelSchema):
    class Meta:
        model = cls

    attr = class_attributes

我需要在该类中使用“传感器”和“ serial_interface”,并且可以使用MSchema.sensorMSchema.serial_interface进行访问。

2 个答案:

答案 0 :(得分:3)

您可以直接调用ModelSchema的元类,而不用使用class声明式地定义该类。

m = marshmallow.ModelSchema

class_attributes = {
    "sensor": Nested(Sensor),
    "serial_interface": Nested(SerialInterface)
}

m = marshmallow.ModelSchema
mc = type(m)
MSchema = mc('MSchema', (m,), {
    'Meta': type('Meta', (), {'model': cls}),
    **class_attributes
    })

如果您不知道,class语句只是使用3个参数调用type(或其他一些元类)的声明性语法:类的名称,父级的元组类和dict类属性。 class语句评估其主体以生成dict,然后调用type(或另一个给定的元类),并将返回值绑定到名称。一些简单的例子:

 # Foo = type('Foo', (), {})
 class Foo:
     pass

 # Foo = Bar('Foo', (), {})
 class Foo(metaclass=Bar):
     pass

 # Foo = Bar('Foo', (Parent,), {'x': 3})
 class Foo(Parent, metaclass=Bar):
     x = 3

 # def foo_init(self, x):
 #     self.x = x 
 # Foo = Bar('Foo', (), {'__init__': foo_init})
 class Foo(metaclass=Bar):
     def __init__(self, x):
         self.x = x

答案 1 :(得分:0)

不能完全确定我100%理解了这个问题,但是您是否尝试过使用setattr()

示例代码如下:

m_schema = MSchema()
for key, value in class_attributes.items():
    setattr(m_schema, key, value)

setattr(object, string, value)使用一个对象来设置属性,使用一个字符串作为属性名称,并使用一个任意值作为属性值。