Python 在一个对象中,这种巧妙的无限递归破坏技术真的可能吗?

Python 在一个对象中,这种巧妙的无限递归破坏技术真的可能吗?,python,object,recursion,dependencies,Python,Object,Recursion,Dependencies,对象:一个节点,它有一个值和对另一个节点的可选引用。从节点继承的类可能对其他节点有更复杂的引用,处理循环引用对我以后的个人用例至关重要 对于这个问题,我将展示一个简化版本的代码,它只检查它是否到达原始对象(所需的检查被注释掉): 理论上,如果getattribute的elif部分可以工作,我就可以根据函数逐个处理引发的异常,而不必在那么多地方编写检查代码 甚至可以将其他参数传递给Python中的内置函数吗?还有没有更好的方法来编码抛出的错误 我不认为仅仅传递第一个节点就足以检测循环。假设节点A指

对象:一个节点,它有一个值和对另一个节点的可选引用。从节点继承的类可能对其他节点有更复杂的引用,处理循环引用对我以后的个人用例至关重要

对于这个问题,我将展示一个简化版本的代码,它只检查它是否到达原始对象(所需的检查被注释掉):

理论上,如果getattribute的elif部分可以工作,我就可以根据函数逐个处理引发的异常,而不必在那么多地方编写检查代码


甚至可以将其他参数传递给Python中的内置函数吗?还有没有更好的方法来编码抛出的错误

我不认为仅仅传递第一个节点就足以检测循环。假设节点A指向节点B,B指向C,C指向B。如果你尝试遍历这个图,你将遍历一次A,然后永远循环遍历B和C,任何等待再次看到A的循环代码都将永远不会执行。我认识到,因此,注释行将取而代之的是一个包含所有先前节点的列表或集合。。。IIRC,这就是Python如何确保
a=[];a、 附加(a);打印(a)
打印
[…]
,而不是永远循环。不过,这可能会有点贵,因为列表成员资格测试是O(N),您可能要进行N次,总共O(N^2)。集合成员资格测试比较便宜,但是让您的节点实现所需的“hashable”接口可能不难,也可能不难。Equals非常简单,它只检查相同的对象类型和值。但我不太确定如何处理哈希函数实现,但我想我想出了一个简单的方法,尽管可能有点低效,但它符合我的目的:返回哈希(hash(self.val)+哈希(object.\uu hash(self)))我觉得我想对elif块中的代码做的是使用附加的源参数和Python希望调用的下一个名称调用引用节点的getattribute函数。问题是,我不知道如何传入下一个名称值,或者它是否会把事情搞砸。但如果有办法的话,它会满足我的需求。
class Node:
    '''A basic node for dependency mapping. Bundles another type with a reference.'''
    def __init__(self, val = None, ref = None):
        self.ref = ref
        self.val = val

    def __getattribute__(self, name, source = None):
        #While iterating through multiple nodes, throws 
        #an error if the original node is reached. 

        #if self in source:
        if self is source:
            raise AttributeError("Circular dependency detected in getattr()")
        elif name == "ref":
            #Somehow pass the source node into the next node's getattr() call.
        else:
            return object.__getattribute__(self, name)