我试图继承str阶级是为了好玩。
我提供了两种方法,1)使用super()和2)str在构造函数中使用类,如下所示:
class Str2(str):
def __init__(self, value):
super().__init__() # I did not use `value` here, but my code works!
def ishello(self):
if self == "Hello":
return True
else:
False
s = Str2("Hello")
print(s.upper()) # a method of str class
print(s.ishello()) # a new method I defined in Str2 class
Run Code Online (Sandbox Code Playgroud)
class Str2(str):
def __init__(self, value):
str.__init__(value) # It makes sense for me
def ishello(self):
if self == "Hello":
return True
else:
False
s = Str2("Hello")
print(s.upper()) # a method of str class
print(s.ishello()) # a new method I defined in Str2 class
Run Code Online (Sandbox Code Playgroud)
我想知道super().__init__()我的第一个代码是如何工作的,尽管我没有使用value
提前致谢。
str.__init__不执行任何操作(类似于tuple.__init__,以及其他不可变类)。实际的初始化发生在__new__. 从概念上讲,这是有道理的,因为__new__返回一个新对象,而__init__可以在现有对象上运行多次。这意味着无论您调用super().__init__有或str.__init__没有参数,甚至完全省略调用,您都会得到相同的结果。
当您调用时Str2(value),您实际上是在调用type.__call__(Str2, value),该调用value同时传递给__new__和__init__。由于您没有重写__new__,因此无论做什么,您都可以从其行为中获得全部好处__init__。
简而言之,如果你不想修改value,你可以去掉你的自定义__init__。如果您确实想修改value,请覆盖__new__:
class Str2(str):
def __new__(cls, value):
value = "My prefix " + value
return super().__new__(cls, value)
Run Code Online (Sandbox Code Playgroud)