Python 实例方法与否
考虑以下示例:Python 实例方法与否,python,methods,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 =
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)
我是否应该明确说明这确实是一种“方法”(Bar1)
您应该尽量不要向用户公开Bar
的实现。如果它调用某个内部类的方法,他为什么会在意呢?重要的是外部API调用的行为方式
如果将其作为一种方法,则意味着:
- 它会更改对象的内部状态,或
- 它需要在每次调用时重新计算(如果它表示自创建对象以来的时间量,则只是一个愚蠢的示例),或者
- 它需要(相对)大量的时间来执行,并且无法缓存
这两种方法似乎都不适用于您的情况(当然,您有更多的信息,因为您实际上知道
bar()
的作用,以及它的行为在未来可能会发生什么变化)。Bar2
显然是一种黑客行为(可能是为了减少源代码长度,也可能是为了减少调用开销)。我不会这样做
原因:
① Bar2().bar
是Foo
的一种方法(这令人惊讶,因此没有好的风格)。您可以通过查看Bar2().bar.im\u self
来检查这一点
② 子类不可能重写Bar2
的方法。您可以通过这种方式禁用类的一个有价值的功能
③ 稍后更改
Bar
的foo只会在Bar1
中产生预期效果,而在Bar2
中,指向原始foo
方法的指针仍将使用。选项3:Bar3().foo.Bar()
以明确说明涉及的对象不同。如果Foo的bar
与bar
类型完全无关,那么将其作为bar方法公开是没有意义的。这种方法自然适合哪里?它是作用于Bar
,还是作用于Bar
的某些属性?把它放在感觉合适的地方。与下面的答案一样,Bar2
对我来说似乎很奇怪。你假装Foo
上的一个方法是Bar
上的一个方法,但它总是绑定到Foo
的一个特定实例,所以你会大大出乎意料。