非常简单的问题概述:给定对象名称,对象属性信息
'A',{"a":1}
'B',{"b":2}
'C',{"c":3}
尝试创建一个名为(obj)的对象,它有一个对象作为属性,B是a的属性,等等.....
有人能建议我如何在Python中动态创建这样的对象吗?我想用MetaClass
A = type("A",(object,),{"a":1})
B = type("B",(A,),{"b":2})
C = type("C",(B,),{"c":3})
但是它只是传递属性而不是整个类。我的对象结构需要这样:结果:
>>>print(obj.A.a)
>>>print(obj.A.B.b)
>>>print(obj.A.B.C.c)
将:
1
2
3
没有必要使用type
,只需要使用SimpleNamepace
:
In [1]: from types import SimpleNamespace
In [2]: data = {
...: 'A':{"a":1},
...: 'B':{"b":2},
...: 'C':{"c":3},
...: }
In [3]: obj = SimpleNamespace()
...: curr = obj
...: for k, attrs in data.items():
...: new = SimpleNamespace(**attrs)
...: setattr(curr, k, new)
...: curr = new
...:
In [4]: obj
Out[4]: namespace(A=namespace(a=1, B=namespace(b=2, C=namespace(c=3))))
In [5]: obj.A.a, obj.A.B.b, obj.A.B.C.c
Out[5]: (1, 2, 3)
一个简单的命名空间基本上是:
class Namespace:
def __init__(self, **kwargs):
vars(self).update(kwargs)
这里有一个基本问题。你想让类A包含B,但又想让B从A派生,你不能在一个语句中同时做这两件事。你有可能实现你的结构,但这看起来有点傻:
base = type('base',(object,),{})
A = type("A",(base,),{"a":1})
base.A=A
B = type("B",(A,),{"b":2})
A.B=B
C = type("C",(B,),{"c":3})
B.C=C
obj = base()
print(obj.A.a)
print(obj.A.B.b)
print(obj.A.B.C.c)