Python 调用内置类的_init__()和用户定义类的_init__()之间的区别

Python 调用内置类的_init__()和用户定义类的_init__()之间的区别,python,class,python-object,Python,Class,Python Object,我正在学习python类,无法理解以下行为: 在下面的示例中,我扩展了内置的str类: class uStr(str): def __init__(self,u_str): str.__init__(u_str) #<<<------- no self is needed def underline(self): underlines = format('', '-^' + str(len(self)))

我正在学习python类,无法理解以下行为:

在下面的示例中,我扩展了内置的
str
类:

class uStr(str):
    def __init__(self,u_str):
        str.__init__(u_str)       #<<<------- no self is needed

    def underline(self):
        underlines = format('', '-^' + str(len(self)))
        return str.__str__(self) + '\n' + underlines

为什么在调用超类的
\uuuu init\uuuu
的第二个示例中,我们需要将
self
作为参数,而在调用
str
\uuuuu init\ucode>的
\uuu init\uuuu>中,我们根本不需要这些
实现。您可以只继承超类实现。如果您确实需要自定义构造,那么对于
uStr
,您应该在
\uuuuuu新的\uuuuuuu
中进行,而不是在
\uuuuuu初始化\uuuuuuuuuu
中进行


str
它自己的
\uuuuu init\uuuuu
。它在
\uuuuu new\uuuuuu
中进行所有初始化,因为
str
实例是不可变的,而在
\uuuuuu init\uuuuu
中进行初始化将是可变的
str
对象继承
\uuuuu init\uuuu

object.\uuuuu init\uuuu
object.\uuuu new\uuuuu
有点奇怪。如果正好有一个
对象、\uuuuu init\uuuuu
对象、\uuuu new\uuuu
被重写,那么被重写的一个在给定参数(超出
self
)时抛出错误,而另一个忽略参数,以避免您必须提供不做重写的工作。但是,如果两个或两个都被重写,则如果给定参数(超出
self
),则两者都将抛出错误。您可以在源代码中的a中看到这一点

str
实现
\uuuuuuuuuuuuuuuuuuu新的
,但从
对象继承
\uuuuuuuuuuuuuuuuuuuuu
。当您重写
\uuuuu init\uuuuu
并调用
str.\uuuuu init\uuuuu
时,您实际上是在调用
对象

当你调用
str.\uuuu init\uuu(uuu str)
时,你实际上是在创建一个
对象。\uuuuu init\uuuu
调用
u str
,而不是调用
self
,这个对象是错误的。由于
u_str
没有
\u_init\u_
重写(并且由于您只传递一个参数,该参数被解释为
self
),
对象。\u_init\u
无提示地执行任何操作

当你调用
str.\uuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu


看起来您根本不需要覆盖子类中的构造。如果这样做,自定义
str
子类的构造的正确方法是重写
\uuuuu new\uuuu
。如果出于某种奇怪的原因,您必须调用
str.\uuuu init.\uuuuu
,那么正确的调用应该是
str.\uuuu init.\uuuuuu(self)
super()。由于
object.\uuuuu init\uuuuu
不进行任何初始化,您也可以省略超类构造函数调用。

“不需要self”-是的。那个
\uuuu init\uuuu
调用是错误的。令人困惑的是,你应该忽略的论点实际上是
u_str
。谢谢@user2357112支持Monica的回答。我从答案中得到了一些想法,但我认为我仍然需要更深入地了解这一点。
from fraction import *

class MixedFraction(Fraction):
    def __init__(self, *args):
        Fraction.__init__(self, args[0], args[1])     #<<<-------self is needed

    def getWholeNum(self):
        return self.getNumerator() // self.getDenominator()