1

考虑以下示例:

class Foo(object):
    def bar(self):
        return "bar"

class Bar1(object):
    def __init__(self):
        self.foo = Foo()
    def bar(self):
        return self.foo.bar()

class Bar2(object):
    def __init__(self):
        self.bar = Foo().bar

Bar1().bar() == Bar2().bar()

应该更喜欢 Bar1 和 Bar2 中的哪一个?替代方案的优缺点是什么?

我想问的是有一个实例只有一个方法,该方法用于另一个实例。我应该明确表示它确实是一种“方法”(Bar1)还是应该保存一个函数调用和一些复杂性(Bar2)?

4

2 回答 2

2

Bar2显然是一种 hack(可能是为了减少源长度,也可能是为了减少调用开销)。我不会这样做。

原因:

Bar2().bar是一种方法Foo(这是令人惊讶的,因此没有好的风格)。您可以通过查看来自行检查Bar2().bar.im_self

Bar2②子类不能覆盖的方法。您可以通过这种方式禁用类的一项有价值的功能。

Bar后面改' foo 只会有预期的效果,而在Bar1while中Bar2指向原来的方法的指针foo仍然会被使用。

于 2013-09-17T10:44:18.203 回答
0

我是不是应该说清楚它确实是一种“方法”(Bar1)

您应该尽量不要将实现暴露Bar给用户。他为什么要关心它是否调用了某个内部类的方法?重要的是外部 API 调用的行为方式。

如果将其设为方法,则意味着:

  • 它改变了对象的内部状态,或者
  • 它需要在每次调用时重新计算(只是一个愚蠢的例子,如果它表示自创建对象以来的时间量),或者
  • 执行需要(相对)大量时间并且无法缓存。

两者似乎都不适用于您的情况(当然,您有更多信息,因为您实际上知道做什么bar(),以及它的行为将来会如何变化)。

于 2013-09-17T10:41:56.303 回答