Python 类 的链表

LinkedList of Python Classes

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

'A',{"a":1}
'B',{"b":2}
'C',{"c":3}

尝试创建一个名为 (obj) 的对象,该对象具有 A 对象作为属性,B 是 A 的属性,依此类推......

有人可以建议我如何在 Python 中动态创建此类对象吗?我在考虑使用 MetaClass。

A = type("A",(object,),{"a":1})
B = type("B",(A,),{"b":2})
C = type("C",(B,),{"c":3})

但它只是传递属性而不是整个class。我的对象结构需要是这样的: 结果:

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

你这里有一个根本问题。您希望 class 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)