Python 类的链表
Posted
技术标签:
【中文标题】Python 类的链表【英文标题】:LinkedList of Python Classes 【发布时间】:2021-10-13 15:41:17 【问题描述】:非常简单的问题陈述概述: 给定对象名称、对象属性信息
'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)
但它只是传递属性而不是整个类。我的对象结构必须是这样的: 结果:
>>>print(obj.A.a)
>>>print(obj.A.B.b)
>>>print(obj.A.B.C.c)
将给予:
1
2
3
【问题讨论】:
A
不应该进入B
等属性的字典吗?
如何将对象 A 传递到对象 B 的字典或命名空间中?那就是q
你希望obj.A.B
是一个类还是一个对象?
【参考方案1】:
为此使用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)
【讨论】:
谢谢。这正是我想要的。【参考方案2】:你这里有一个基本问题。你希望类 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)
【讨论】:
我实际上并不认为继承是隐含的。 他的例子展示了继承,但问题描述得很模糊,没有提到用例。以上是关于Python 类的链表的主要内容,如果未能解决你的问题,请参考以下文章