如何获得Python Object Parent?

时间:2011-07-04 19:53:09

标签: python class object parent

所以,我试图得到一个自定义对象在'里面'的对象。这是一个例子。

假设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 ?我知道我可以编写Test函数来传递它

o.test = Test(o)

但我宁愿从类定义中做到这一点。

5 个答案:

答案 0 :(得分:7)

(我知道这是一个古老的问题,但由于没有答案......) 您可以尝试弄乱garbage collector。建议查看模块级对象,但一些快速代码实验给出了这样的结果:尝试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 }]

b

对于奖励积分,请对其使用gc.get_referents(*objs)来检查列表中是否有相同的init

一些注意事项/警告:

  • 我认为你应该只在{{1}}或其他方法中将父Foo对象传递给Bar。这就是我要做的,而不是我上面的建议。
  • This SO answer指出了垃圾收集器在连接两种方式时遇到的一些问题 - 您目前没有这样做,但如果您这样做,那么就是这样。

答案 1 :(得分:5)

你可以这样做:

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

答案 2 :(得分: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.

希望这会对你有所帮助。

答案 3 :(得分:1)

如果您想要可继承的对象,请正确执行

class Test(object):
    def __init__(self):
        self.a = 1

class Bobcat(Test):
    def __init__(self):
        Test.__init__(self)
        self.b = 4 

答案 4 :(得分:0)

你在谈论继承吗?你的意思并不是很清楚,但如果你只想这样做:

class Test():
  def __init__(self,o):
    self.parent = o
  def other_method(self):
    do_something_with(self.parent)

效果很好。

** ed:如果你想这样做,这根本不是你应该怎么做的继承。但是,您描述问题的方式我认为您想要创建一个类似于树的对象结构,而不是让类继承彼此的属性。