实例方法或n

2024-04-27 05:22:28 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑以下示例:

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)?你知道吗


Tags: 实例方法self示例returnobjectfooinit
2条回答

Should I make it clear that it is indeed a "method" (Bar1)

您应该尽量不要向用户公开Bar的实现。为什么他会关心它是否调用某个内部类的方法?重要的是外部API调用的行为。你知道吗

如果将其作为一种方法,则意味着:

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

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

Bar2显然是一种黑客攻击(可能是为了减少源代码长度,也可能是为了减少调用开销)。我不会这么做的。你知道吗

原因:

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

②对于子类,重写Bar2的方法是不可能的。这样就禁用了类的一个有价值的特性。你知道吗

③以后更改Bar的foo只会在Bar1中产生预期的效果,而在Bar2中,指向原始foo方法的指针仍将被使用。你知道吗

相关问题 更多 >