我有一个A类,它包含严格意义上的“已-a”关系。A包含B是有意义的。但是,只有几种特定的方法调用B会影响A。在大多数情况下,这只会导致A类有一种方法调用B类的方法,没有真正的好处,而且两个函数调用的缺点。
class A():
b=B()
__init__(self):
self.a=[]
def addToA(self,a):
self.a.append(a)
def addToB(a):
# do something with self.a
b.addToB(a)当A发生变化时,人们对在A中提供具体需要的方法有什么想法?然而,如果不是这样,则直接去B:
z=A()
z.addToB(a)
z.b.methSpecificToB(x,y,z)我觉得我有点打破了封装,但是这样做更有意义,而不是简单地提供多余的方法。
发布于 2016-03-19 10:54:56
我通常倾向于调用A上的方法来调用B上的方法,因为它保护A的客户端不受A和B实现中的更改。例如,如果以后的更改要求调用methodSpecificToB和B上的其他方法,我只需要更改A.addtoB,而如果Z和其他类直接调用B,则必须更改它们。
这最终取决于B变化的可能性。如果这种情况永远不会发生,那么暴露B可能是可以的,但如果这是可能的,那么间接就更安全了。
发布于 2016-03-19 11:22:37
我会用一个@property装饰器来解决这个问题。当您设置A.B时,这将自动设置B.A。
class A:
_b = None
@property
def b(self):
return self._b
@b.setter
def b(self, b):
self._b = b
b.a = self
class B:
a = None
foo = A()
bar = B()
foo.b = bar
bar.a == foo # True
foo.b == bar # True这里发生的事情是,当您设置foo.b时,它被保存为foo._b。(下划线表示通常用于内部使用的“隐藏”变量。)同时,bar.a被设置为foo,使您能够从bar访问foo。
尝试访问foo.b时,将返回foo._b。因为我们在前面将其设置为bar,所以我们也从foo访问bar。
关于Python属性有许多教程。这一个是善良的--好的.
https://stackoverflow.com/questions/36100629
复制相似问题