Inheritance 在子类中初始化超类对象

Inheritance 在子类中初始化超类对象,inheritance,subclass,super,metaclass,Inheritance,Subclass,Super,Metaclass,有人能给我解释一下在child_2课程中super()的用途吗?我发现super()初始化在child_2中而不是child_1中拾取convert_id()函数有点违反直觉。我认为通过调用super(),可以使用类_1中的函数来初始化对象 from abc import ABC, abstractmethod class base(ABC): @abstractmethod def convert_id(self, id): pass class child

有人能给我解释一下在child_2课程中super()的用途吗?我发现super()初始化在child_2中而不是child_1中拾取convert_id()函数有点违反直觉。我认为通过调用super(),可以使用类_1中的函数来初始化对象

from abc import ABC, abstractmethod

class base(ABC):
    @abstractmethod
    def convert_id(self, id):
        pass

class child_1(base, ABC):
    def __init__(self, id):
        self.new_id = self.convert_id(id)

    def convert_id(self, id):
        return id

class child_2(child_1):
    def __init__(self, id):
        self.id = id
        super().__init__(id=self.id)

    def convert_id(self, id):
        return id+1

test = child_2(0)
print(test.new_id)
1

这是在具有继承的面向对象编程中正常、预期和基本的行为方式

其思想是,您的专门化类(继承类)可以专门化特定的方法。一般的模式是,超类中的一个方法可以协调各种其他方法的调用,以执行相关实例的特定任务,并且,如果一个专门的子类希望通过重写来细化其中一个方法,那么就是被调用的方法

在运行时术语中,发生的是
child_1.\uu_init__
接收的
self
child_2
的一个实例(它也恰好是
child_1
的一个实例),但在该接收对象中调用的方法将从child_2解析。 如果你在
child\u 1中将“self”视为
child\u 1
的一个实例,那么这只是“违反直觉的”。这种“强制转换”从未发生过,而且在Python中自然也不可行

现在,如果您的代码中有一种模式需要这种行为:child\u 1中的
\uuu init\uuuu
只调用
child\u 1
中定义的方法,而在子类中从不调用overiden方法,这通过“名称混乱”机制是可行的:如果一个方法或属性以两个下划线(
\uuuu
)开头,编译器将把类名烘焙到该方法或属性名中,以一种不会被意外覆盖的方式(而
\uuuu
的提示让程序员清楚地知道不应该被覆盖)。在Python以外的其他语言中,这种行为是通过使用“private”方法实现的:子类本身无法访问该方法(与“protected”不同)

及时:此行为与您从abc.abc或其使用的自定义元类继承的事实无关-这就是语言的工作方式


换句话说,如果调用方法
\uu convert\u id
而不是
convert\u id
,则会发生您期望的行为。但请记住,这不是继承的自然行为,只有一种可能的方法比简单地允许方法被覆盖的方法用途更少。

感谢您的明确解释!