当前位置: 首页 > 面试题库 >

Python super()参数:为什么不选择super(obj)?

韦叶秋
2023-03-14
问题内容

我试图了解何时以及如何在Python中正确使用super()(2.7.x或3.x)

>>> help(super)翻译告诉我怎么称呼它:

class super(object)
 |  super(type) -> unbound super object
 |  super(type, obj) -> bound super object; requires isinstance(obj, type)
 |  super(type, type2) -> bound super object; requires issubclass(type2, type)

我了解在Python3.x中现在可以在类定义中使用super(),但是我不明白为什么super(obj)不可能。或super(self)在类定义中。

我知道一定有原因,但是我找不到。对我来说,这些行等于super(obj.__class__, obj)或,super(self.__class__, self)并且行得通吗?

我认为super(obj)即使在Python 3.x中,键入也是一个不错的快捷方式。


问题答案:

仅在Python
2中才需要两个参数的形式。其原因是,它self.__class__总是引用继承树中的“叶子”类(即对象的最特定类),但是调用super时需要告诉它是当前正在调用的实现,因此它可以在继承树中调用下一个实现。

假设您有:

class A(object):
   def foo(self):
      pass

class B(A):
   def foo(self):
      super(self.__class__, self).foo()

class C(B):
   def foo(self):
      super(self.__class__, self).foo()

c = C()

需要注意的是c.__class__C,始终。现在考虑如果您打电话给我会发生什么c.foo()

当您调用super(self.__class__, self)C的方法时,它将类似于call super(C, self),这意味着“调用C继承的此方法的版本”。那会叫B.foo,这很好。但是当您super(self.__class__, self)从B呼叫时,它仍然像在呼叫super(C, self),因为它是相同的self,所以self.__class__仍然如此C。结果是B中的调用将再次调用,B.foo并且发生无限递归。

当然,您真正想要的是能够调用super(classThatDefinedTheImplementationThatIsCurrentlyExecuting, self),这实际上就是Python 3super()所做的。

在Python 3中,您可以做,super().foo()并且可以做正确的事。对我来说,你对super(self)捷径的含义还不清楚。在Python
2中,由于上述原因,它不起作用。在Python 3中,这将是“ longcut”,因为您可以只使用Plain super()

super(type)super(type1, type2)用途可能仍然偶尔需要在Python 3,但那些总是不正常的情况下,更深奥的用途。



 类似资料:
  • 目前正在使用React Native,并尝试使用React Native nfc ios和React national nfc,以便我可以在ios和Android之间进行跨设备通信。我发现他们无法沟通,但我认为这是由于一个更广泛的问题(因为其他现有的应用程序也无法工作)。 如果我在iPhone7上下载NFC阅读器应用程序,在Android上下载NFC写入器应用程序,它们就无法通信。这是为什么呢?

  • 如果你曾经使用过构建工具,你可能会对遇到的问题感到很沮丧,构建工具不是应该自动帮你完成项目的构建吗?你不得不向性能、扩展性等妥协。 比如你在构建一个项目的发布版本时,你要把一个文件拷贝到指定的位置,你在项目的元数据那里添加了版本的描述,如果版本号匹配一个特定的数字时,就把文件从A拷贝到B处。如果你依赖XML来构建,你要实现这个任务就像噩梦一样,你只能通过非标准的机制来添加一些脚本到构建中,结果就是

  • 来源:https://github.com/atom-china/manual 这个世界上有那么多种编辑器,为什么你要花时间学习和使用 Atom 呢? 虽然 Sublime 和 TextMate 之类的编辑器已经非常好用了,但它们仅提供了很有限的拓展性。而在另一个极端,Emacs 和 Vim 提供了灵活的拓展性,但它们并不是很友好,需要使用专用的编程语言来配置和拓展。 我们觉得我们可以做得更好。我

  • 为什么选择 NuxtJS

  • Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性: 作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型. 作为负载均衡服务器:Ngin

  • 虽然市场上有几十种不同的版本控制系统,一些世界上最著名的项目(例如 Linux 内核, Ruby on Rails,或是jQuery)都选择了使用 Git 作为它们的版本控制系统。为什么它们都选择 Git 呢? 节省时间 Git 运行快速。尽管我们在这里讨论的只是运行一个命令所需要的几秒钟,但是把它累积在你的日常工作中就是一个不小的飞跃了。它可以节省那些不必要的等待时间,并且去完成其它一些有意义的