我不太确定这在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
在任何情况下,如果希望一个对象有权访问另一个对象,请将引用存储到可访问的位置。这里没有魔法。