首页
学习
活动
专区
圈层
工具
发布

组合OOP
EN

Stack Overflow用户
提问于 2016-03-19 10:38:30
回答 2查看 74关注 1票数 0

我有一个A类,它包含严格意义上的“已-a”关系。A包含B是有意义的。但是,只有几种特定的方法调用B会影响A。在大多数情况下,这只会导致A类有一种方法调用B类的方法,没有真正的好处,而且两个函数调用的缺点。

代码语言:javascript
复制
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:

代码语言:javascript
复制
z=A()
z.addToB(a)
z.b.methSpecificToB(x,y,z)

我觉得我有点打破了封装,但是这样做更有意义,而不是简单地提供多余的方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-19 10:54:56

我通常倾向于调用A上的方法来调用B上的方法,因为它保护A的客户端不受A和B实现中的更改。例如,如果以后的更改要求调用methodSpecificToB和B上的其他方法,我只需要更改A.addtoB,而如果Z和其他类直接调用B,则必须更改它们。

这最终取决于B变化的可能性。如果这种情况永远不会发生,那么暴露B可能是可以的,但如果这是可能的,那么间接就更安全了。

票数 1
EN

Stack Overflow用户

发布于 2016-03-19 11:22:37

我会用一个@property装饰器来解决这个问题。当您设置A.B时,这将自动设置B.A

代码语言:javascript
复制
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属性有许多教程。这一个是善良的--好的.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36100629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档