假设我有两个A和B类:
Class A:
# A's attributes and methods here
Class B:
# B's attributes and methods here
现在我可以按如下方式评估B类对象中A的属性:
a_obj = A()
b_obj = B(a_obj)
我需要的是双向访问。 如何在A?
中访问B和B属性中的A属性答案 0 :(得分:10)
您需要以任何方式创建指针:
class A(object):
parent = None
class B(object):
def __init__(self, child):
self.child = child
child.parent = self
现在A
可以引用self.parent
(前提是它不是None
),而B
可以引用self.child
。如果您尝试将A
的实例设为多个B
的子项,则最后一个“父”将获胜。
答案 1 :(得分:5)
为什么不以一种可以通过继承来处理它的方式来规划你的对象。
class A(object):
# stuff
class B(A):
# has A methods/properties
class C(B):
# has A and B methods/properties
在这种情况下,通过提前计划,您可以将C
用于通才对象,将A
与B
用作更专业/裸露的父对象。
答案 2 :(得分:3)
此方法非常有用,因为您可以互换地使用这两个类的对象。这有一个严重的问题,我将在最后解释。
class A:
def MethodA(self):
return "Inside MethodA"
def __init__ (self, Friend=None):
self.__dict__['a'] = "I am a"
self.__dict__['Friend'] = Friend
if Friend is not None: self.__dict__['Friend'].__dict__['Friend'] = self
def __getattr__(self, name):
if self.Friend is not None: return getattr(self.Friend, name)
raise AttributeError ("Unknown Attribute `" + name + "`")
def __setattr__(self, name, value):
if self.Friend is not None: setattr(self.Friend, name, value)
raise AttributeError ("Unknown Attribute `" + name + "`")
class B:
def MethodB(self):
return "Inside MethodB"
def __init__ (self, Friend=None):
self.__dict__['b'] = "I am b"
self.__dict__['Friend'] = Friend
if Friend is not None: self.__dict__['Friend'].__dict__['Friend'] = self
def __getattr__(self, name):
if self.Friend is not None: return getattr(self.Friend, name)
raise AttributeError ("Unknown Attribute `" + name + "`")
def __setattr__(self, name, value):
if self.Friend is not None: setattr(self.Friend, name, value)
raise AttributeError ("Unknown Attribute `" + name + "`")
<强>解释强>
根据this page,仅当在特定对象的空间中找不到请求的属性时,才会在python对象上调用__getattr__
和__setattr__
。所以在构造函数中我们建立了两个类之间的关系。然后,只要调用__getattr__
或__setattr__
,我们就会使用getattr
方法引用其他对象。 (getattr,setattr)我们使用__dict__
在构造函数中指定值,这样我们就不会调用__setattr__
或__getattr__
。
示例运行
b = B()
# print b.a # Throws AttributeError, as A and B are not related yet
a = A(b)
print a.a
print a.b
print b.a # Works fine here, as 'a' is not found b, returns A's a
print b.b
print a.MethodA()
print a.MethodB()
print b.MethodA()
print b.MethodB()
I am a
I am b
I am a
I am b
Inside MethodA
Inside MethodB
Inside MethodA
Inside MethodB
现在,严重的问题:
如果我们尝试访问这两个对象中不存在的属性,我们将最终进行无限递归。假设我想从'a'访问'C'。由于C不在a中,它将调用__getattr__
并且它将引用b对象。由于b对象没有C,它将调用__getattr__
,它将引用对象a。所以我们最终会进行无限递归。因此,当您不访问两个对象都不知道的任何内容时,此方法可以正常工作。