如何获取Python对象的父类?

8 投票
6 回答
44817 浏览
提问于 2025-04-16 20:49

我正在尝试获取一个自定义对象“内部”的对象。下面是一个例子。

假设 o 是一个对象——它是什么类型并不重要,它可以用来存储变量。

o = Object()
class Test():
    def __init__(self):
        self.parent = o ## This is where I fall off; I want to be able to access
                        ## the o object from within the Test object

o.test = Test()

那么,我该如何从 Test 里面获取 o 呢?我知道我可以通过

o.test = Test(o)

把它传进去来写 Test 函数,但我更想在类定义内部来实现这个。

6 个回答

2

嗯,我不太清楚你具体在尝试什么。不过我做过类似的事情。

class Node(object):

    def __init__(self, name):
        self.parent = ''
        self.child = []
        self.name = name

    def setParent(self, parent):
        if isinstance(parent, tempNode):
            self.parent = parent.name
            parent.setChild(self.name)

    def setChild(self, child):
        self.child.append(child)

    def getParent(self):
        return self.parent

    def getChild(self):
        return self.child

如果你想创建一个父级,可以这样说:

n1 = Node('Father')
n2 = Node('Son')
n2.setParent('Father') # it will set n1 as parent and n2 as child at the same time.

希望这能对你有所帮助。

6

你可以这样做:

class Object:
    def __setattr__(self, name, value):
        if isinstance(value, Test):
            value.set_parent(self)
        self.__dict__[name] = value

class Test:
    def set_parent(self, parent):
        self.parent = parent

o = Object()
o.test = Test()
assert o.test.parent is o
10

(我知道这个问题有点老了,但因为没有人回答...)
你可以试着调整一下垃圾回收器。我本来想建议你查看模块级别的对象,但经过一些简单的代码实验,我发现可以试试gc.get_referrers(*objs)这个函数。

import gc

class Foo(object):
    """contains Bar"""
    def __init__(self, val):
        self.val = val
        self.bar = None

class Bar(object):
    """wants to find its parents"""
    def __init__(self, something):
        self.spam = something

    def find_parents(self):
        return gc.get_referrers(self)

结果可能不太简单明了,所以你需要自己想办法判断哪个f是你想要的。注意下面的'f': <__main__.Foo object at ...>

>>> f = Foo(4)
>>> b = Bar('ham')
>>> f.bar = b
>>> b.find_parents()
[{'bar': <__main__.Bar object at 0x7f3ec5540f90>, 'val': 4}, <frame object at 0x238c200>,
{'b': <__main__.Bar object at 0x7f3ec5540f90>,
    'Bar': <class '__main__.Bar'>,
    'f': <__main__.Foo object at 0x7f3ec5540f10>,    # <-- these might be
                                          # the droids you're looking for
    '__builtins__': <module '__builtin__' (built-in)>,
    '__package__': None, 'gc': <module 'gc' (built-in)>, '__name__': '__main__',
    'Foo': <class '__main__.Foo'>, '__doc__': None
}]

如果想要额外的收获,可以对这些对象使用gc.get_referents(*objs),看看同一个b是否在它们的列表中。

一些注意事项:

  • 我觉得你应该直接把父级Foo对象传给Bar,可以在init方法里或者其他方法里。这样做比我之前的建议要好。
  • 这个SO回答提到垃圾回收器在双向链接时会遇到一些问题——你现在没有这样做,但如果你这样做了,提前告诉你一下。

撰写回答