如何从python中的属性中获取对象?

时间:2015-11-09 20:39:45

标签: python

我想做这样的事情:

class B():
    def __init__(self,c):
        self.c=c
    def getA(self):
        #this is what I want
class A():
    def __init__(self,d):
        self.b = B(d)

a = A(d)

我想要的是当我执行时

a.b.getA()

我可以通过属性b获得使用此方法的对象a。 我无法将任何新变量传递给函数,因为在实现中这是一个由其他人编写的类,更改输入变量意味着更改了很多东西。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

由于您似乎在B构造函数中构造了A实例,因此请为B实例提供对A实例的引用:

class B():
    def __init__(self, c, a):
        self.c = c
        self.a = a
    def getA(self):
        return self.a

class A():
    def __init__(self, d):
        self.b = B(d, self)

a = A(d)

某些 Python实现中,有时可以使用here查找实例,但正如文档所述,应该避免使用它“用于除了调试“

import gc

class B():
    def __init__(self,c):
        self.c = c

    def getA(self):
        for i in gc.get_referrers(self):
            if not isinstance(i, dict):
                continue

            for j in gc.get_referrers(i):
                if isinstance(j, A) and getattr(j, 'b', None) is self:
                    return j

        return

class A():
    def __init__(self,d):
        self.b = B(d)

a = A(42)
print(a.b.getA() is a)

第一个get_referrers来电会找到__dict__个实例的A;这可能是dict类型;然后我们浏览引用self的词典的所有对象,如果其中任何一个类型为A,并且其属性b的值为is self,我们返回那个对象。

因此,条款print(a.b.getA() is a)将打印为真。

但严重的是,请不要使用此代码。