Inheritance 在子类中初始化超类对象
有人能给我解释一下在child_2课程中super()的用途吗?我发现super()初始化在child_2中而不是child_1中拾取convert_id()函数有点违反直觉。我认为通过调用super(),可以使用类_1中的函数来初始化对象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
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
,则会发生您期望的行为。但请记住,这不是继承的自然行为,只有一种可能的方法比简单地允许方法被覆盖的方法用途更少。感谢您的明确解释!