【问题标题】:How to get Python Object Parent?如何获得 Python 对象父级?
【发布时间】:2011-07-04 19:53:09
【问题描述】:

所以,我正在尝试获取自定义对象“内部”的对象。这是一个例子。

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

但我宁愿从类定义中进行。

【问题讨论】:

  • 您能用其他语言说明您要查找的内容吗?因为我对您的问题的理解在面向对象的语言中毫无意义......
  • 当有多个指向同一个对象的指针时,你想返回什么?我不认为你正在寻找的是真的可能。
  • 嗯,我正在寻找的基本上是一种能够从自定义类中访问一个类的对象是其属性的对象的方法。让我这样说——我无法定义“父”类——它在我正在使用的游戏引擎中被硬编码。因此,A 类已经定义,并且可以像普通对象一样处理属性。 B 类是一个自定义类 - 我从 B 类创建一个对象并将其放入 A 类的属性中。因此,parentobj.objb = ClassB()。现在,objb 有没有办法告诉 parentobj 是什么?

标签: python class object parent


【解决方案1】:

(我知道这是一个老问题,但因为它没有答案......)
你可以试着弄乱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
}]

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

一些注意事项/警告:

  • 我认为您应该将父 Foo 对象传递给 Bar,可以是 init 或其他方法。这就是我会做的,而不是我上面的建议。
  • This SO answer 指出了垃圾收集器在链接两种方式时遇到的一些问题 - 你目前没有这样做,但如果你这样做了,仅供参考。

【讨论】:

    【解决方案2】:

    你可以这样做:

    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
    

    【讨论】:

    • 问题在于 Test() 无法对在另一个对象 o 上分配给名称 test 做出反应,除非该对象 o 对分配给o.test 并让它告诉分配的对象Test()
    【解决方案3】:

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

    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.
    

    希望这会对你有所帮助。

    【讨论】:

      【解决方案4】:

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

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

      效果很好。

      **ed:如果你想这样做的话,这根本不是你应该如何进行继承的。但是,您描述问题的方式我认为您想创建对象的树状结构,而不是让类相互继承属性。

      【讨论】:

      • 他没有将他的代码称为继承。他只是表明他(OP)可以从对象内通过self.parent 访问o,因为这很可能是他要求的。
      • phant0m 说了什么。他将自己的需求描述为“自定义对象'内部'的对象”的方式,我不认为继承是他想要的。
      • 不,就像 kasnero 和 phant0m 所说,我的问题与继承无关,而是从另一个对象中获取对象的问题。
      【解决方案5】:

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

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

      【讨论】:

      • 它们根本不可继承——这两个类彼此无关。关键是获取存储类对象的对象 - 基本上,给定 objectA.obj = ObjectB(),有没有办法从 ObjectB 的代码中获取 objectA,例如 owner 财产或类似的东西?还是我必须自己做?
      • @SolarLune:你可以引用一个对象无数次,例如a = b = c = obj。这三个中的哪一个会 .owner 返回?你确实有gc.get_referrers(*objs),尽管它(也许)做了你想要的。编辑:哎呀,这是旧的。无视。
      【解决方案6】:

      也许是这样的?

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-27
        • 2017-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-28
        相关资源
        最近更新 更多