LinkedList of Python Classes



非常简单的问题概述:给定对象名称,对象属性信息

'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)

相关内容

  • 没有找到相关文章

最新更新