在Python中正确使用super - 我应该明确引用类名吗?

Jas*_*n S 4 python class-hierarchy python-2.7

class Foo(object):
    def whee(self):
        return 77

class Bar(Foo):
    def whee(self):
        return super(Bar, self).whee() + 1

class Baz(Foo):
    def whee(self):
        return super(self.__class__, self).whee() + 1
Run Code Online (Sandbox Code Playgroud)

双方BarBaz返回相同的结果whee().我习惯了语法Bar.有什么理由我不应该使用语法Baz吗?

Kev*_*vin 6

有什么理由我不应该使用语法Baz吗?

是的,有一个原因你不应该使用这种语法. 如果您是子类Baz,则super()调用将解析回来Baz.whee(),您将陷入无限循环.这也适用于语法super(type(self), self).whee().

(好吧,实际上你会破坏递归限制和错误.但无论哪种方式都是一个问题.)

  • @JasonS:是的,这就是为什么Python 3必须添加一个"秘密"`__class__`局部变量来保存该信息.这就是零参数`super()`的工作原理. (3认同)