在子类中初始化超类对象

ian_chan

有人可以向我解释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
布宜诺斯艾利斯

这是带有继承的面向对象编程行为的正常,预期和必要的方式。

这个想法是您的专门类(继承的类)可以专门化特定的方法。通常的模式是,超类中的方法可以协调各种其他方法的调用,以针对所讨论的实例执行特定的任务-并且,如果专门的子类希望通过重写来优化其中一种方法,则称为。

在运行方面,会发生什么情况是,selfchild_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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

是否可以从子类更新在超类中初始化的对象?

用子类型初始化父类中的对象

如果仅初始化超类对象,是否可以调用特定于子类的方法?

使用超类初始化子类对象Java

使超类的初始化程序返回特定的子类?

数据不是来自超类的子类初始化问题

在子类中初始化超类变量(构造函数中需要)

Swift中的子类不会继承其超类的初始化程序

Java-在子类中初始化超类变量吗?

为什么此超类在初始化期间不在子类中运行方法?

如何在子类的初始化中设置超类实例

在超类初始化之前,子类最终进行静态初始化?

对象工厂设计以初始化父类或子类对象

java,从超类初始化子类

在父类中使用的子类中初始化属性

当子类在构造函数中初始化时,是否应该在超类的声明中保留字段初始化?

在Swift中重写超类初始化器

无法子类化UIButton:必须调用超类'UIButton'的指定初始化程序

从超类初始化子类的类实例变量

类对象初始化

python超类初始化参数

如果我使用超类来初始化子类对象,为什么该对象具有子类的属性,但是具有超类的方法呢?

使用python3中的现有超类实例初始化子类

为什么在Java中将超类初始化为子类?

初始化子类时可访问超类的变量

在Ruby中初始化类对象变量

无法在 Python 类中初始化 spark 对象

在自己的静态初始化器中创建类的对象

如何在Javascript中初始化类对象