是否可以将对象所属的所有者类引用为属性?



我不太确定这在python中是否可能(或类似的东西(。我想从作为此类属性的对象访问类的方法(或其他对象(。

请考虑以下代码:

class A():
def __init__(self):
self.b = B()
self.c = C()
def print_owner(self):
print('owner')
class B():
def __init__(self):
pass
def call_owner(self):
self.owner().print_owner()

这样b作为类A的对象属性,可以引用A的方法或属性吗?

或者类似地,b是否有可能访问c

这是可能的。可以将对 A 到 B 构造函数的引用传递给:

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

因此,B.a 存储对其所有者 A 的引用。

可以有很多对对象B()的引用,而不仅仅是类A实例中的引用。因此,这是不可能的,因为它在您的代码中。(好吧,你可以尝试一个技巧,比如在内存中查找类A的所有实例,并找到其属性b指向你的 B 实例的实例,但这是一个非常糟糕的主意(。

应在B的实例中显式存储对所有者的引用。

这里有几个选项。更好的可能是@Sianur建议的。它简单、有效且明确。给这个答案一个赞成票。

另一种选择是让所有者强迫其仆从。B可以做类似的事情

def call_owner(self):
if hasattr(self, 'owner'):
self.owner().print_owner()
else:
print('I am free!')

同时,A会将所有者属性设置为自身:

def __init__(self):
self.b = B()
self.c = C()
self.b.owner = self.c.owner = self

在任何情况下,如果希望一个对象有权访问另一个对象,请将引用存储到可访问的位置。这里没有魔法。

最新更新