如何判断 super() MRO 下一个在线订单是什么?
How to tell what the super() MRO next-in-line order is?
我怎么知道 super() 将在 MRO 中采用哪条路径?
超级()
Python 中 super() 的主要目的是在派生 class 中调用重写的基 class 方法,就像 super 在其他语言中所做的那样。
通常这样做是为了使派生 class 方法可以通过在其自身代码之前或之后调用它来扩充基础 class 方法,而不是完全替换它。
class Derived(Base):
def method(self, arg):
# Maybe do something here
super(Derived, self).method(arg)
# Could so something here as well
super() 函数实际上通过返回代理对象 class 来工作,该代理将调用委托给父对象。
在这种情况下使用 super() 的优点是您不需要显式命名基 class,这有助于可维护性。
super() 函数也可以用在更复杂的多重继承情况下,它可以做一些事情,比如委托给姐姐 class
阅读:Python's Super Considered Harmful and Python’s super() considered super!.
这两个很好的资源应该可以回答您的所有问题。
简而言之,super()
使用标准方法解析顺序 (MRO) 来查找您要求的方法。看看这张图片:
E继承自C和D。C继承自A,A继承自object
。 D 继承自 B,B 继承自 object
。红色箭头显示 super()
在其搜索中使用的 MRO。
请注意 super()
而不是 引用父 class。即使 A 继承自 object
而不是 D,D 在 MRO 中紧随其后。因此,为了回答您的问题,"next in line" 指的是 MRO。
我怎么知道 super() 将在 MRO 中采用哪条路径?
超级()
Python 中 super() 的主要目的是在派生 class 中调用重写的基 class 方法,就像 super 在其他语言中所做的那样。 通常这样做是为了使派生 class 方法可以通过在其自身代码之前或之后调用它来扩充基础 class 方法,而不是完全替换它。
class Derived(Base):
def method(self, arg):
# Maybe do something here
super(Derived, self).method(arg)
# Could so something here as well
super() 函数实际上通过返回代理对象 class 来工作,该代理将调用委托给父对象。 在这种情况下使用 super() 的优点是您不需要显式命名基 class,这有助于可维护性。
super() 函数也可以用在更复杂的多重继承情况下,它可以做一些事情,比如委托给姐姐 class
阅读:Python's Super Considered Harmful and Python’s super() considered super!.
这两个很好的资源应该可以回答您的所有问题。
简而言之,super()
使用标准方法解析顺序 (MRO) 来查找您要求的方法。看看这张图片:
E继承自C和D。C继承自A,A继承自object
。 D 继承自 B,B 继承自 object
。红色箭头显示 super()
在其搜索中使用的 MRO。
请注意 super()
而不是 引用父 class。即使 A 继承自 object
而不是 D,D 在 MRO 中紧随其后。因此,为了回答您的问题,"next in line" 指的是 MRO。