首页
学习
活动
专区
工具
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文件下的TestClass类下的test_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

    72710

    在__init__中设置对象的父类

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

    10810

    类和对象的创建过程(元类,__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__内定义的内容。

    73050

    【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 类 ; 类的调用 代码示例 :

    42010

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

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

    2.8K40

    C++ 类之间的互相调用

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

    2.5K80

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

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

    2.7K30

    ReentrantReadWriteLock类的使用

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

    46720
    领券