实例方法与否

时间:2013-09-17 10:30:18

标签: python methods

考虑以下示例:

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)?

2 个答案:

答案 0 :(得分:2)

Bar2显然是一个黑客攻击(可能是为了减少源长度并可能减少呼叫开销)。我不会这样做。

原因:

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

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

③稍后更改Bar的foo只会在Bar1中产生预期效果,而在Bar2中,指向原始foo方法的指针仍然是在使用中。

答案 1 :(得分:0)

  

我是否应该明确表示它确实是一种“方法”(Bar1)

您应该尽量不向用户公开Bar的实现。如果它调用某个内部类的方法,他为什么要关心?重要的是外部API调用的行为方式。

如果你把它作为一种方法,那就意味着:

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

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