Python 调用内置类的_init__()和用户定义类的_init__()之间的区别
我正在学习python类,无法理解以下行为: 在下面的示例中,我扩展了内置的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)))
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()