2011-07-04 53 views
2

所以,我试图得到一个自定义对象是'内'的对象。这是一个例子。如何获取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.test = Test(o) 

但我宁愿从类定义里面做。

+1

你能说明你在用其他语言寻找什么吗?因为我对你的问题的理解在面向对象的语言中没有意义...... –

+0

当有多个指向同一对象的指针时,你想要返回什么?我不认为你在找什么是真的可能。 –

+0

那么,我正在寻找的基本上是一种方法,能够达到一个对象的类,该对象是自定义类中的属性。让我这样说吧 - 我无法定义'父'类 - 它在我使用的游戏引擎中被硬编码。所以,类A已经定义好了,并且可以像普通对象一样处理属性。 B类是一个自定义类 - 我从B类创建一个对象并将其放入A类的属性中。因此,parentobj.objb = ClassB()。现在,有没有什么方法可以让objb知道什么是parentobj? – SolarLune

回答

0

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

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

它完美。

** ed:如果你想这样做,这完全不是你应该做的继承。然而,你描述你的问题的方式我认为你想创建一个树状结构的对象,而不是让对方继承属性。

+1

做错事的错误方法 –

+0

他没有将他的代码称为继承。他只是表明他(OP)可以通过'self.parent'从对象内部访问'o',因为这就是他所要求的,很可能。 – phant0m

+1

什么phant0m说。他将自己的需求描述为“自定义对象是'内部'的对象”,“我不认为他想要的是继承。 – krasnerocalypse

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 
+3

问题在于,Test()无法对另一个对象'o'上的名称'test'进行反应,而不是将该对象'o'作为对'o的赋值的反应。测试“,并告诉分配的对象Test()。 –

1

如果你想继承对象做正确

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

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

它们根本不是可继承的 - 两个类没有任何关系。重点是获取一个类的对象存储的对象 - 基本上,给定objectA.obj = ObjectB(),有没有办法从ObjectB的代码中获取objectA,就像__owner__属性或类似的东西?或者我必须自己做? – SolarLune

+0

@SolarLune:你可以引用一个巨大的对象,例如'a = b = c = obj'。那三个中的哪一个将会.owner返回?你有'gc.get_referrers(* objs)'虽然哪(可能)做你想做的。编辑:哎呀,这是旧的。漠视。 – velis

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. 

希望这会帮助你。

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 
}] 

奖励积分,使用这些gc.get_referents(*objs)检查是否相同b在他们的名单。

的一些注意事项/警告:

  • 我想你应该只是传递父Foo对象,以酒吧,无论是在init或另一种方法。这就是我会做的,而不是我上面的建议。
  • This SO answer指出了链接两种方式时垃圾收集器存在的一些问题 - 您目前没有这样做,但如果你这样做,fyi。