【问题标题】:Proper use of super in Python -- should I reference the class name explicitly?在 Python 中正确使用 super —— 我应该明确引用类名吗?
【发布时间】:2017-10-17 17:25:04
【问题描述】:
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

BarBaz 都为 whee() 返回相同的结果。我习惯了Bar 中的语法。我有什么理由不应该使用Baz 中的语法?

【问题讨论】:

  • 永远不要将self.__class__ 传递给super。如果就这么简单,super 一开始就不会要求这个论点。

标签: python python-2.7 class-hierarchy


【解决方案1】:

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

是的,你不应该使用这种语法是有原因的。如果你从Baz 继承,super() 调用将解析回Baz.whee(),你会卡住在无限循环中。这也适用于语法super(type(self), self).whee()

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

【讨论】:

  • 哦。哎呀,有道理。
  • ...所以我猜这意味着类方法无法访问它们声明的类,除非您明确引用该类?
  • @JasonS:是的,这就是为什么 Python 3 必须添加一个“秘密”__class__ 局部变量来保存该信息。这就是零参数 super() 的工作原理。
  • 实际上可以在 Python 3 上显式访问 __class__ 变量(甚至有文档记录),但并不鼓励这样做,人们会感到困惑。
猜你喜欢
  • 2011-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-13
  • 2016-09-29
  • 2020-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多