如何定义一个具有动态属性的class?
How to define a class with dynamic attributes?
在我的项目中,我需要创建一个 class,其属性由 dict
传递,如下所示:
class_attributes = {"sensor": Nested(Sensor),
"serial_interface": Nested(SerialInterface)}
class MSchema(marshmallow.ModelSchema):
class Meta:
model = cls
attr = class_attributes
我需要 "sensor" 和 "serial_interface" 在 class 中,并且可以使用 MSchema.sensor
或 MSchema.serial_interface
访问。
您可以直接调用 ModelSchema
的元 class,而不是使用 class
语句以声明方式定义 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
(或其他一些元 class):名称class,父 classes 的元组,以及 class 属性的 dict
。 class
语句评估其主体以生成字典,然后调用 type
(或另一个给定的元 class),并将 return 值绑定到名称。一些更简单的例子:
# 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
不完全确定我是否 100% 理解问题,但您是否尝试过使用 setattr()?
示例代码如下所示:
m_schema = MSchema()
for key, value in class_attributes.items():
setattr(m_schema, key, value)
setattr(object, string, value)
采用一个对象来设置属性,一个字符串作为属性名称,一个任意值作为属性值。
在我的项目中,我需要创建一个 class,其属性由 dict
传递,如下所示:
class_attributes = {"sensor": Nested(Sensor),
"serial_interface": Nested(SerialInterface)}
class MSchema(marshmallow.ModelSchema):
class Meta:
model = cls
attr = class_attributes
我需要 "sensor" 和 "serial_interface" 在 class 中,并且可以使用 MSchema.sensor
或 MSchema.serial_interface
访问。
您可以直接调用 ModelSchema
的元 class,而不是使用 class
语句以声明方式定义 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
(或其他一些元 class):名称class,父 classes 的元组,以及 class 属性的 dict
。 class
语句评估其主体以生成字典,然后调用 type
(或另一个给定的元 class),并将 return 值绑定到名称。一些更简单的例子:
# 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
不完全确定我是否 100% 理解问题,但您是否尝试过使用 setattr()?
示例代码如下所示:
m_schema = MSchema()
for key, value in class_attributes.items():
setattr(m_schema, key, value)
setattr(object, string, value)
采用一个对象来设置属性,一个字符串作为属性名称,一个任意值作为属性值。