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)
非常简单的问题陈述概述: 给定对象名称,对象属性信息
'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)