如何获取Python对象父级



因此,我正在尝试获取自定义对象所在的对象。下面是一个例子。

假设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()

那么,我如何从测试内部获得o?我知道我可以写测试函数来通过

o.test = Test(o)

但我更愿意从类定义内部进行。

(我知道这是一个老问题,但由于没有答案…(
你可以试着破坏垃圾收集器。本打算建议查看模块级对象,但一些快速的代码实验给出了这样的结果:尝试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

一些注意事项:

  • 我认为您应该在init或其他方法中将父Foo对象传递给Bar。这就是我要做的,而不是我上面的建议
  • 这个SO的回答指出了垃圾收集器在双向链接时遇到的一些问题——你目前还没有这样做,但如果你这样做了,fyi

您可以这样做:

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

好吧,我不知道你到底在做什么。但我做过这样的事。

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.

希望这对你有帮助。

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

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

它工作得很好。

**ed:如果你想继承的话,这根本不是你应该做的。然而,在描述问题的方式中,我认为您希望创建一个类似树的对象结构,而不是让类相互继承属性。

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

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

也许是这样的?

class Alpha:
def __init__(self):
    self.a = None
def start(self):
    self.get_a()
    self.print()
    self.SubBravo(self).multiply()
    self.print()
    self.SubAlpha(self).add_two()
    self.print()
def get_a(self):
    self.a = int(input("Enter an integer: >>> "))
def print(self):
    print("a: ", self.a)
class SubAlpha:
    def __init__(self, parent):
        self.parent = parent
    def add_two(self):
        print("hello add_two")
        self.parent.a += 2
        self.parent.print()
        self.add_five()
    def add_five(self):
        print("hello add_five")
        self.parent.a += 5
class SubBravo:
    def __init__(self, parent):
        self.parent = parent
    def multiply(self):
        print("hello multiply")
        self.parent.a *= 10

Alpha().start()

最新更新