考虑以下示例:
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)?
答案 0 :(得分:2)
Bar2
显然是一个黑客攻击(可能是为了减少源长度并可能减少呼叫开销)。我不会这样做。
原因:
①Bar2().bar
是Foo
的方法(这是令人惊讶的,因此没有好的风格)。您可以通过查看Bar2().bar.im_self
来自行查看。
②对于子类,不能覆盖Bar2
的方法。您可以通过这种方式禁用类的有价值的功能。
③稍后更改Bar
的foo只会在Bar1
中产生预期效果,而在Bar2
中,指向原始foo
方法的指针仍然是在使用中。
答案 1 :(得分:0)
我是否应该明确表示它确实是一种“方法”(Bar1)
您应该尽量不向用户公开Bar
的实现。如果它调用某个内部类的方法,他为什么要关心?重要的是外部API调用的行为方式。
如果你把它作为一种方法,那就意味着:
两者似乎都不适用于你的情况(当然,你有更多的信息,因为你实际上知道bar()
做了什么,以及它的行为将来如何变化)。