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 类的链表的主要内容,如果未能解决你的问题,请参考以下文章

一文讲透链表操作,看完你也能轻松写出正确的链表代码

利用java实现一个简单的链表结构

salesforce零基础学习(七十八)线性表链形结构简单实现

剑指offer(12)

[Python] 数据结构--实现顺序表链表栈和队列

数据结构之链表OJ练习检验你的链表水平是否合格