Python中既然可以直接通过父类名调用父类方法为什么还会存在super函数?
程序员文章站
2022-06-02 12:09:24
...
比如
要谈论 super,首先我们应该无视 "super" 这个名字带给我们的干扰。
不要一说到 super 就想到父类!super 指的是 MRO 中的下一个类!
不要一说到 super 就想到父类!super 指的是 MRO 中的下一个类!
不要一说到 super 就想到父类!super 指的是 MRO 中的下一个类!
一说到 super 就想到父类这是初学者很容易犯的一个错误,也是我当年犯的错误。
忘记了这件事之后,再去看这篇文章:Python’s super() considered super!
这是 Raymond Hettinger 写的一篇文章,也是全世界公认的对 super 讲解最透彻的一篇文章,凡是讨论 super 都一定会提到它(当然还有一篇 Python's Super Considered Harmful)。
如果不想看长篇大论就去看这个答案,super 其实干的是这件事:
总之前人留下的经验就是:保持一致性。要不全部用类名调用父类,要不就全部用 super,不要一半一半。
如果没有复杂的继承结构,super 作用不大。而复杂的继承结构本身就是不良设计。对于多重继承的用法,现在比较推崇 Mixin 的方式,也就是
另外给一个类获得父类只能用super,比如:
def get_super(cls): super(A,self).func 不是把A的父类的func执行,而是把A的父类的类类型序列中的所有类型的func都执行一次。 http://blog.csdn.net/johnsonguo/article/details/585193
这里面写的挺好的,可以参考下 @laike9m 的解释很到位了,我想说:貌似没法解决参数传递问题啊,只能用python所谓的魔法,把参数全部传递过去,可是两个类,作者不同,什么事情都能发生,参数名重复呢,感觉python这个机制不怎么样 正好第一次接触到这问题,搬运工
inheritance - Understanding Python super() with __init__() methods
class Child(Parent): def __init__(self): Parent.__init__(self)
回复内容:
针对你的问题,答案是可以,并没有区别。但是这题下的回答我感觉都不够好。要谈论 super,首先我们应该无视 "super" 这个名字带给我们的干扰。
不要一说到 super 就想到父类!super 指的是 MRO 中的下一个类!
不要一说到 super 就想到父类!super 指的是 MRO 中的下一个类!
不要一说到 super 就想到父类!super 指的是 MRO 中的下一个类!
一说到 super 就想到父类这是初学者很容易犯的一个错误,也是我当年犯的错误。
忘记了这件事之后,再去看这篇文章:Python’s super() considered super!
这是 Raymond Hettinger 写的一篇文章,也是全世界公认的对 super 讲解最透彻的一篇文章,凡是讨论 super 都一定会提到它(当然还有一篇 Python's Super Considered Harmful)。
如果不想看长篇大论就去看这个答案,super 其实干的是这件事:
def super(cls, inst):
mro = inst.__class__.mro()
return mro[mro.index(cls) + 1]
super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。总之前人留下的经验就是:保持一致性。要不全部用类名调用父类,要不就全部用 super,不要一半一半。
如果没有复杂的继承结构,super 作用不大。而复杂的继承结构本身就是不良设计。对于多重继承的用法,现在比较推崇 Mixin 的方式,也就是
- 普通类多重继承只能有一个普通父类和若干个 Mixin 类(保持主干单一)
- Mixin 类不能继承普通类(避免钻石继承)
- Mixin 类应该单一职责(参考 Java 的 interface 设计,Mixin 和此极其相似,只不过附带实现而已)
另外给一个类获得父类只能用super,比如:
def get_super(cls): super(A,self).func 不是把A的父类的func执行,而是把A的父类的类类型序列中的所有类型的func都执行一次。 http://blog.csdn.net/johnsonguo/article/details/585193
这里面写的挺好的,可以参考下 @laike9m 的解释很到位了,我想说:貌似没法解决参数传递问题啊,只能用python所谓的魔法,把参数全部传递过去,可是两个类,作者不同,什么事情都能发生,参数名重复呢,感觉python这个机制不怎么样 正好第一次接触到这问题,搬运工
inheritance - Understanding Python super() with __init__() methods
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
相关文章
相关视频