有人可以向我解释child_2类中的super()会做什么吗?我发现super()初始化在child_2而不是child_1中选择convert_id()函数有点违反直觉。我以为通过调用super(),应该使用class_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
这是带有继承的面向对象编程行为的正常,预期和必要的方式。
这个想法是您的专门类(继承的类)可以专门化特定的方法。通常的模式是,超类中的方法可以协调各种其他方法的调用,以针对所讨论的实例执行特定的任务-并且,如果专门的子类希望通过重写来优化其中一种方法,则称为。
在运行方面,会发生什么情况是,self
该child_1.__init__
接收是的一个实例child_2
(这也恰好是一个实例child_1
) -但呼吁在接受对象的方法将child_2得到解决。如果您以“自我”child_1.__init__
为例,那只是“违反直觉的” child_1
。这种“转换”永远不会发生,在Python中自然也不可行。
现在,如果您的代码中有一个模式需要这种行为:__init__
in child_1中仅调用in中定义的方法,而不调用child_1
子类中的overiden方法,则可以通过“名称修改”机制来实现:方法或属性以两个下划线(开始__
),编译器将烤类名到该方法或属性名称,在某种程度上,它不会是overfiden意外(同时的提示__
明确的编程人员,它不应该被凌驾)。
及时:这种行为与ou。从abc.ABC或从该类使用的纯属元类继承的事实无关-这就是该语言的工作方式。
换句话说,如果您调用方法__convert_id
而不是,则会发生预期的行为convert_id
。但是请记住,这不是继承所具有的自然行为,而是一种可能的用途,它的用途比简单地允许重写方法要少。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句