【问题标题】:Python reverse introspectionPython反向自省
【发布时间】:2012-05-07 20:41:56
【问题描述】:

让我们假设这个例子:两个兄弟类,其中一个加载另一个类作为新属性,然后我希望在兄弟内部的主类中使用这个属性。

a = 2
class AN(object):
   def __init__(self,a):
       self.aplus = a + 2
       self.BECls = BE(a)


class BE(object):
   def __init__(self,a):
       print a

   def get_aplus(self):
       ????

c = AN(a)

我想做:

c.BECls.get_aplus() 

这将返回类似于 self.self.aplus 的东西(比喻地),即 4

恢复:从 BE 类中的 AN 获取 aplus 属性,不声明为参数,但如果可能,考虑“a”变量必须已经通过 AN 加载。

对不起,如果我没有说清楚,但我已经尝试简化我的真实代码所发生的事情。

我想问题可能是我在课堂上使用的技术。但不确定是什么或如何使它变得更好。

谢谢

【问题讨论】:

  • 为什么不能只给BE 对象一个对其对应AN 的引用?
  • 其实这是我喜欢做的,但是怎么做呢??干杯
  • 我不能只给 BE 一个对象 (an_obj = AN(self.a)),因为它会陷入无限循环,试图一遍又一遍地加载自身,导致 RunTimeError 上升。
  • @RaymondHettinger 的答案中的代码显示了如何。

标签: python class introspection siblings


【解决方案1】:

OP 的问题:

从 BE 类中的 AN 中获取 aplus 属性,而不声明为 争论,但如果可能的话,做一个“反向内省”, 考虑到“a”变量必须已经通过 AN 加载。

我们最接近“反向自省”的方法是搜索gc.getreferrers()

也就是说,最好简单地明确关系

class AN(object):
   def __init__(self,a):
       self.aplus = a + 2
       self.BECls = BE(self, a)

class BE(object):
   def __init__(self, an_obj, a):
       self.an_obj = an_obj
       print a

   def get_aplus(self):
       return self.an_obj.aplus

if __name__ == '__main__':
    a = 2
    c = AN(a)
    print c.BECls.get_aplus()     # this returns 4

【讨论】:

  • 我认为这是解决这个问题的一种方法,但在我的真实案例中,我真的很喜欢使用已经传递给主负载类的任何参数,否则我需要将几个对象传递给其他对象几个加载的类,这感觉我喜欢做太多的重复。这种倒退的方式似乎更合乎逻辑。我将尝试探索 getreferrers 并查看是否可以解决。谢谢,答案出奇地快。
  • 我尝试使用 gc 函数,但它们都没有给我所需的对象。无论如何,为答案喝彩。希望找到一些聪明的方法来解决这个问题。仍然没有被怀疑。这个答案是迄今为止最接近的解决方案。
猜你喜欢
  • 1970-01-01
  • 2014-06-25
  • 1970-01-01
  • 2016-08-18
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多