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
的一个特定实例,所以你会大大出乎意料。