当我继承 str 类时 super().__init__() 如何工作?

Par*_*ark 5 python

我试图继承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

提前致谢。

Mad*_*ist 5

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)