首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

超类的__init__不是使用数据类调用的

在面向对象编程中,超类(也称为父类或基类)是指派生类继承属性和方法的类。init是Python中的特殊方法,用于初始化对象的属性。当创建一个派生类的对象时,通常会调用超类的init方法来初始化继承的属性。

然而,数据类是Python 3.7版本引入的一种特殊类,用于简化数据对象的创建和操作。数据类使用@dataclass装饰器来自动生成属性和方法,包括init方法。数据类的init方法是自动创建的,不需要手动调用。

因此,超类的init方法不会被数据类调用。如果需要在数据类中调用超类的init方法,可以使用super()函数来实现。super()函数返回一个代理对象,通过它可以调用超类的方法。

以下是一个示例代码,演示了如何在数据类中调用超类的init方法:

代码语言:txt
复制
from dataclasses import dataclass

class SuperClass:
    def __init__(self, arg1, arg2):
        self.arg1 = arg1
        self.arg2 = arg2

@dataclass
class SubClass(SuperClass):
    def __init__(self, arg1, arg2, arg3):
        super().__init__(arg1, arg2)
        self.arg3 = arg3

obj = SubClass("value1", "value2", "value3")
print(obj.arg1)  # 输出:value1
print(obj.arg2)  # 输出:value2
print(obj.arg3)  # 输出:value3

在上述代码中,SuperClass是一个超类,SubClass是一个派生类,并且使用@dataclass装饰器将其定义为数据类。在SubClass的init方法中,使用super().init(arg1, arg2)调用了超类SuperClass的init方法,以初始化继承的属性arg1和arg2。然后,SubClass新增了一个属性arg3,并将其赋值为传入的参数arg3。

这样,通过在数据类中使用super()函数调用超类的init方法,可以实现对继承属性的初始化。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Python中__init__()作用

最开始学习python,认为定义时__init__方法作用等同于C中构造函数,但是使用之后发现也有区别。...__init__(a,"wang")即__init__作用是初始化实例后对象b在子类不重写__init__方法时,子类会默认调用__init__方法子类也可以重写__init__方法,来给子类定义专属属性当然...,上面写是比较官方解释用简单的话来讲,可以理解为,属性如果直接写在里面一般是要有值。...例如:class fun() a = 3这样情况下,属性无法变成变量,当将属性以self.a方式定义到初始化方法中,那属性也可以当成变量例如:class fun(): def _..._init__(self, a): self.a = af = fun(3)print(f.a)Output:--3--

2.5K10

pytest使用_实例调用调用

5.通过关键字表达式来进行测试 pytest -k "MyClass and not method" 这种方式会执行文件名,名以及函数名与给定字符串表达式相匹配测试用例。...上面的用例会执行TestMyClass.test_something但是不会执行TestMyClass.test_method_simple 6.通过节点id来测试 每个被选中测试用例都会被分配一个唯一...nodeid,它由模块文件名和以下说明符组成:参数化名、函数名和参数,用::分隔。...# 测试test_1.py文件下TestClasstest_method方法 pytest test_1.py::TestClass::test_method # test1.py文件 class...x = "hello" assert 'h' in x 7.从包中运行测试 pytest --pyargs pkg.testing 这将会导入pkg.testing并使用其文件系统位置来查找和运行测试

1.4K20
  • Python中super()和__init__()关系

    Base createcreat B Base create--------------------------使用super()继承时不用显式引用基。...-------------------------------3. super不是,而是继承顺序下一个在多重继承时会涉及继承顺序,super()相当于返回继承顺序下一个,而不是,类似于这样功能...,因此执行顺序是A —> B—>—>Base  执行过程相当于:初始化childC()时,先会去调用childA构造方法中 super(childA, self)....childA基础Base, childB继承childA和Base,如果childB需要调用Base__init__()方法时,就会导致__init__()被执行两次:class Base(object...create-------------- 使用super()避免重复调用,如下:class Base(object): def __init__(self): print 'Base

    71010

    在__init__中设置对象

    第一个解决方案是使用工厂。工厂是一个函数,它可以动态地创建。在工厂中,可以根据传入参数来决定创建哪个。...然后,它根据parent值来决定创建哪个。如果parent是Red,则创建一个Circle,它是Red。...如果parent是Blue,则创建两个,Circle和Square,它们都是Blue。最后,它返回创建。这样,我们就可以在实例化对象时动态地指定对象了。第二个解决方案是使用依赖注入。...例如,以下代码使用依赖注入来动态地为Circle对象注入颜色:class Color(object): def __init__(self, color): self.color =...然后,它定义了一个Circle,它接受一个颜色对象作为参数。最后,它创建了两个Circle对象,并指定了它们顏色。使用依赖注入,我们就可以在实例化对象时动态地为它注入它依赖关系。

    9410

    和对象创建过程(元,__new__,__init__,__call__)

    __call__ : 对象可call,注意不是,是对象。...__new__方法在定义中不是必须写,如果没定义,默认会调用object.__new__去创建一个对象。如果定义了,就是会覆盖,使用自定义,这样就可以自定制创建对象行为。  ...__   __init__ 方法通常用在初始化一个实例时候,但__init__其实不是实例化一个时候第一个被调用 方法...当使用 Persion(name, age) 这样表达式来实例化一个时,最先被调用方法 其实是 __new__ 方法。...元处理过程:定义一个时,使用声明或者默认对该类进行创建,对元求type运算,得到父元(该类声明父元),调用父元__call__函数,在父元__call__函数中, 调用该类声明

    1.2K50

    Python__new__和__init__区别

    在写Python时,或者看某些项目源码时,总是见到__init__和__new__方法,一直没有深入研究两者区别,今天聊聊这个。 __new__ __new__是(class)方法。...class新创建实例时,会调用__new__,它主要控制一个新实例创建。 需要知道是,__new__是实例创建第一步。首先调用它,再由它负责返回新实例。...但运行后会发现,结果根本不是我们想那样,我们任然得到了-3。这是因为对于int这种 不可变对象,我们只有重载它__new__方法才能起到自定义作用。这是修改后代码: ?...通过重载__new__方法,我们实现了需要功能。 __init__ __init__是实例方法。...class调用__init__时,是对这个class生成新实例初始化,初始化内容,就是__init__内定义内容。

    69150

    【C++】面向对象编程示例 ( 案例需求 | Visual Studio 创建 | 声明 | 实现 | 调用 )

    一、案例需求 使用 C++ 面向对象 , 抽象出一个 立方体 ; 立方体 有 长 / 宽 / 高 / 面积 / 体积 私有 成员变量 , 以及 访问 这些成员变量 公共 成员方法 ; 还提供 立方体...在弹出菜单中选择 " 添加 / ©… " 选项 ; 此时会弹出 " 添加 " 对话框 , 在 弹出 " 添加 " 对话框中 名 输入框中 , 输入 名 Cube , 会自动生成 ....作用是 , 任何 包含该 Cube.h 头文件后 , 就可以使用该 Cube ; 声明 : #pragma once class Cube { public: // 设置立方体长度...m_height == cube.getHeight())) { // 长宽高 全部相等 return 1; } else { return 0; } return 0; } 五、调用...---- 在 main 函数代码中 , 导入自定义 头文件 Cube.h , // 导入自定义 #include "Cube.h" 之后 , 可以使用 Cube ; 调用 代码示例 :

    29910

    Java中加载机制---父和子类多态调用

    null 1) 上面程序最大难点,也是最重要地方就是:在父构造函数中调用了虚函数,并且这个函数被子类重载了 2) 继承时候,子类与父有着同名属性和同名方法,关于同名属性初始化过程也是必须要了解...3) 构造时候,Java机制是到底先给属性分配空间并赋值,还是先处理 构造函数,换句话说,当我们使用new操作符生成一个对象实例时候,加载机制是怎么样, 如果这三个问题都搞定了,都理解了,...这个过程说白了,就是一个加载时候,执行过程,必须等所有的存储空间都分配好,才能够赋值,而不是一个属性分配好变量之后立刻就赋值,这个理解是错误。...baseName分配地址,地址变量指向null; 4)由于父不需要再也没有了,那么这个时候父和子类内存分配都做完了,接下来就是需要为  属性进行初始化工作 5)首先是给父baseName...,多态调用 7)子类有重载,所以调用子类方法,但是子类baseName还没有初始化,所以就没有直接打出null了 8)父创建完毕,接下来就是去执行子类创建工作了, 9)首先为子类属性进行初始化

    2.7K40

    keras使用Sequence调用大规模数据集进行训练实现

    使用Keras如果要使用大规模数据集对网络进行训练,就没办法先加载进内存再从内存直接传到显存了,除了使用Sequence以外,还可以使用迭代器去生成数据,但迭代器无法在fit_generation里开启多进程...,会影响数据读取和预处理效率,在本文中就不在叙述了,有需要可以另外去百度。...下面是我所使用代码 class SequenceData(Sequence): def __init__(self, path, batch_size=32): self.path = path...这里要注意,use_multiprocessing参数是是否开启多进程,由于python多线程不是真的多线程,所以多进程还是会获得比较客观加速,但不支持windows,windows下python...Sequence调用大规模数据集进行训练实现就是小编分享给大家全部内容了,希望能给大家一个参考。

    1.3K20

    C++ 之间互相调用

    这几天做C++11线程池时遇到了一个问题,就是A想要调用B方法,而B也想调用A方法 这里为了简化起见,我用更容易理解观察者模式向大家展开陈述 观察者模式:在对象之间定义一对多依赖,这样一来...,并让subject调用remove方法将自己除名 为了简化起见 在这里图如下 ?...这是因为虽然有成员前向声明 但你仅可以定义指向这种裂隙指针或引用,可以声明但不能定义以这种不完全类型或者返回类型参数 而这里你想要在Observer调用subject方法,而subject...是在Observer后面声明定义,所以无法调用subject方法 而C++是没有对函数前向声明 所以我们要有一个方法,让我们在声明Subject时能看到Observer声明 而在声明...Subject声明,进而调用subjectRemove方法,有不会引起互相包含问题了 运行结果如下 ?

    2.4K80

    python之类重写父方法与调用方法

    ---- 一、背景   Python 是一门易于学习、功能强大编程语言。它提供了高效高级数据结构,还能简单有效地面向对象编程。...Python 优雅语法和动态类型以及解释型语言本质,使它成为多数平台上写脚本和快速开发应用理想语言。下面我们来介绍一下python重写父方法与调用方法。...---- 二、重写父方法与调用方法   在继承关系中,子类会自动继承父中定义方法,但如果父方法功能不能满足需求,就可以在子类中重写父方法。...2.子类调用方法   如果需要在子类中调用方法,可以使用内置函数super()或通过“父名.方法名()”方式来实现。 例:子类调用方法示例。...__init__(name, sex) #调用__init__方法 self.score = score #创建对象实例 student = Stu('Jack','Male

    2.7K30

    ReentrantReadWriteLock使用

    ,但程序运行效率却比较低。...共享锁:读相关锁就叫共享锁。 排他锁:写相关锁就叫排他锁。 我们首先看一下共享锁: ? ? ? ?...我们看两个线程是异步执行,这就是共享锁好处,多个线程可以同时执行lock()方法后面的代码,提高程序执行效率。下面我们看一下排他锁: ? ? ? ? 我们看输出是同步执行。...这也是排他锁特性,如果线程中有操作实例变量操作,为了保证线程安全可以用排他锁。 共享锁和排他锁也是互斥锁。...这句话意思是说如果线程已经获取到了共享锁,但程序没有执行完,那么此时,其它线程在获取排他锁时,是获取不到,只能等待共享锁释放后才可获取到。 ? ? ? ? ?

    45920
    领券