使用不同的参数在 python 中调用超类构造函数

2024-03-11

class A():
    def __init__( self, x, y):
        self.x = x
        self.y = y

class B():
    def __init__( self, z=0):
        self.z = z  

class AB(A,B):
    def __init__( self, x, y, z=0):
        ?

如何使 AB 的构造函数使用正确的参数调用 A 和 B 的构造函数?

我试过了

class AB(A,B):
    def __init__( self, x, y, z=0):
        A.__init__(x,y)
        B.__init__(z)

但这给了我一个错误。


其他答案建议添加self到第一个参数。

但通常会调用__init__在父类中由super.

考虑这个例子:

class A(object):
    def __init__(self, x):
        print('__init__ is called in A')
        self.x = x


class B(object):
    def __init__(self, *args, **kwargs):
        print('__init__ is called in B')
        super(B, self).__init__(*args, **kwargs)


class AB(B, A):
    def __init__(self, *args, **kwargs):
        print('__init__ is called in AB')
        super(AB, self).__init__(*args, **kwargs)

AB类包含构造函数和初始化器的调用顺序:

>>> AB.__mro__
(<class '__main__.AB'>, <class '__main__.B'>, <class '__main__.A'>, <type 'object'>)

看,首先AB's __init__被调用,然后B的,那么A的,然后object's.

让我们检查:

>>> ab = AB(1)
__init__ is called in AB
__init__ is called in B
__init__ is called in A

但是通过这条链的这些调用是由super。当我们打字时super(AB, self),这意味着:找到然后下一堂课AB in __mro__链的self.

然后我们应该调用super in B,在链中寻找下一个类B: super(B, self).

使用很重要super并且不手动调用A.__init__(self,...)等等,因为这可能会导致以后出现问题。阅读本文以获取更多信息 https://fuhm.net/super-harmful.

所以,如果你坚持super,那么就有问题了。__init__类中的方法需要不同的参数。而且你无法确定其顺序super将调用这些类中的方法。顺序由下式确定C3算法 http://www.python.org/download/releases/2.3/mro/在创建班级时。在子类中,另一个类可能会介于调用链之间。所以你不能有不同的参数__init__,在这种情况下,您将始终考虑所有继承链以了解如何__init__方法将被调用。

例如,考虑添加C(A) and D(B)类和CD它们的子类。然后A之后将不再被调用B, 但是之后C.

class A(object):
    def __init__(self, *args, **kwargs):
        print('__init__ is called in A')
        super(A, self).__init__(*args, **kwargs)


class B(object):
    def __init__(self, *args, **kwargs):
        print('__init__ is called in B')
        super(B, self).__init__(*args, **kwargs)

class AB(B,A):
    def __init__(self, *args, **kwargs):
        print('__init__ is called in AB')
        super(AB, self).__init__(*args, **kwargs)

class C(A):
    def __init__(self, *args, **kwargs):
        print('__init__ is called in C')
        super(C, self).__init__(*args, **kwargs)

class D(B):
    def __init__(self, *args, **kwargs):
        print('__init__ is called in D')
        super(D, self).__init__(*args, **kwargs)


class CD(D,C):
    def __init__(self, *args, **kwargs):
        print('__init__ is called in CD')
        super(CD, self).__init__(*args, **kwargs)

class ABCD(CD,AB):
    def __init__(self, *args, **kwargs):
        print('__init__ is called in ABCD')
        super(ABCD, self).__init__(*args, **kwargs)




>>> abcd = ABCD()
__init__ is called in ABCD
__init__ is called in CD
__init__ is called in D
__init__ is called in AB
__init__ is called in B
__init__ is called in C
__init__ is called in A

所以我认为考虑使用是个好主意delegation而不是这里的继承。

class AB(object):
    def __init__(self, x, y, z=0):
        self.a = A(x,y)
        self.b = B(z)

所以,你只需创建a and b的实例A and B里面的课程AB目的。然后可以根据需要通过参考的方法来使用它们self.a and self.b.

使用或不使用委托取决于您的情况,而您的问题尚不清楚。但这可能是一个值得考虑的选择。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用不同的参数在 python 中调用超类构造函数 的相关文章

  • 为什么 Python zipfile 不提供与命令行 zip 相同的输出 .zip 文件大小?

    这是生成的文件的大小zip seq 10000 gt 1 txt zip 1 1 txt adding 1 txt deflated 54 ls og 1 zip rw r r 1 22762 Aug 29 10 04 1 zip 这是一个
  • 查找具有不同强度/亮度的相似图像

    假设我有如下图像 我可以选择什么来比较两个图像之间的相似度 显然它们是相同的图像 只是亮度不同 我找不到任何可行的方法 目前我最好的选择是训练 cnn 或自动编码器并比较输出的特征向量 但这似乎有点矫枉过正 任何提示将不胜感激 相当强大的工
  • Python 中的密码子生成

    我有这段代码 用于将 DNA 字符串转换为密码子列表 然后将此列表转换为具有各自氨基酸的字符串 然而 当我运行代码并且 DNA 字符串以一对核苷酸 例如 CT 而不是三联体结尾时 代码不会生成氨基酸序列 正如您在输出中看到的 from co
  • 回归模型 statsmodel python

    这更多是一个统计问题 因为代码运行良好 但我正在学习 python 中的回归建模 我在下面使用 statsmodel 编写了一些代码来创建一个简单的线性回归模型 import statsmodels api as sm import num
  • 可扩展的宏定义

    灵感来自于评论区 https stackoverflow com questions 23879410 is it possible to extend a function lambda macro in scheme 23879575
  • 根据另一个非索引数组中的值从 numpy 数组中选择元素

    假设我有以下两个数组 a array 1 L 74 423088306605 5 H 128 05441039929008 2 L 68 0581377353869 0 H 88 15726964130869 4 L 97 45015825
  • 使用 isdigit 表示浮点数?

    a raw input How much is 1 share in that company while not a isdigit print You need to write a number n a raw input How m
  • python-messaging 无法处理 HTTP 请求

    我正在使用下面的代码尝试使用 python messaging 发送彩信https github com pmarti python messaging blob master doc tutorial mms rst https gith
  • Dataframe unstack 性能 - pandas

    我正在尝试拆开数据框 它工作正常 但问题是我正在处理 CSV 文件中的巨大数据集 约 10 亿 这是示例数据集 236539 48512569874 Name Danny 236539 48512569874 Class 12 236539
  • 与 GridSearchCV 的并行错误,与其他方法一起工作正常

    我使用 GridSearchCV 时遇到以下问题 它在使用时给我一个并行错误n jobs gt 1 同时n jobs gt 1与 RadonmForestClassifier 等单一模型配合良好 下面是一个显示错误的简单工作示例 train
  • 创建 Pyomo 约束的性能

    我正在用 pyomo 设置一个更大的能量优化问题 正如其他中提到的 设置花费了不合理的时间问题 https stackoverflow com questions 43413067 performance of pyomo to gener
  • 使用 python 更改目录

    我碰巧发现我无法从 python 代码中更改实际目录 我的测试程序如下 from os import system def sh script system bash c s script sh cd home sh pwd 的输出pwd
  • 将日期(系列)列从一个 DataFrame 添加到其他 Pandas,Python

    我正在尝试将日期列从 df1 广播 到 df2 在 df1 中 我有所有用户的姓名及其基本信息 在 df2 中 我有一个用户购买的列表 df1 和 df2 代码 https i stack imgur com sN0uJ png 假设我有一
  • 如何检测斑点并将其裁剪成 png 文件?

    我一直在开发一个网络应用程序 我陷入了一个有问题的问题 我会尝试解释我想要做什么 在这里您看到第一个大图像 其中有绿色形状 我想要做的是将这些形状裁剪成不同的 png 文件 并使它们的背景透明 就像大图像下面的示例裁剪图像一样 第一张图像将
  • python中的unicode错误[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 在下面的代码中我收到错误mailSe
  • 数据框更新后如何刷新绘图?

    假设您已经使用以下方法构建了一个图形px line 使用数据框 数据框稍后会添加新数据 用新数据刷新数据的好方法是什么 一个例子可以是px data stocks 从列的子集开始 GOOG AAPL AMZN FB NFLX MSFT 例如
  • 如何让 IPython 按类别组织制表符补全的可能性?

    当一个对象有数百个方法时 制表符补全很难使用 通常 有趣的方法是由被检查对象的类而不是其基类定义或重写的方法 如何让 IPython 对其制表符完成可能性进行分组 以便首先检查对象的类中定义的方法和属性 然后是基类中的方法和属性 看起来像是
  • 为什么Python安装程序不断弹出?

    每当我尝试运行 Python 文件时 都会自动弹出此窗口 虽然 我可以关闭它 但有时它会连续打开 7 10 个窗口 这令人恼火 谁能告诉我为什么会发生这种情况 None
  • 为什么我不能在扩展 List 的类中调用 OrderBy?

    我有一堂课 Deck 其中包含一个名为的方法Shuffle 我正在致力于重构Deck延长List
  • 如何从 Django 中的链接设置预定义的表单值?

    我的项目是这样布局的 1 page has many categories 2 category belongs to page has many items 3 item belongs to category 当我进入一个页面时 我想修

随机推荐

  • 同时提交 PayPal 表格并更新数据库

    如果我使用标准 PayPal 表单进行付款 我是否可以通过稍微更改代码以包含更新详细信息来同时更新我的 数据库 这是我想要使用的标准 PayPal 付款表格 将根据需要进行更改
  • Java动态加载类

    我正在尝试将类动态加载到组件中 我使用文件选择器来选择要加载的 JAR 文件 然后使用选项窗格来获取类的名称 我在互联网上搜索了如何将 java 文件转换为 URL 以便将其加载到 URLClassLoader 中 我想出了 File my
  • 如何降级flutter SDK版本?

    我当前的 Dart SDK 版本是 2 1 2 dev 0 0 flutter 0a7dcf17eb 但是我需要使用 flutter 文本识别依赖项 需要 SDK 版本 gt 1 23 0 如何降级我的版本 在Flutter安装目录下执行
  • 非半透明的UITabBar创建奇怪的灰色条

    使用 SwiftUI 我有几个嵌套在 TabBar 内的 NavigationView 这样做的原因是我想更改每个 NavigationView 的标题以反映所选选项卡 但我找不到其他方法来执行此操作 另外 对于我的客户来说 UITabBa
  • 在电子邮件中发送 asp.net mvc 操作结果

    我想在 asp net mvc 中使用我的 Action 作为模板引擎 生成字符串形式 我可以通过电子邮件发送 伪代码 public ActionResult Register SendEmail View ToString return
  • 无法通过 Windows 任务计划程序运行我的 python 脚本

    我已经安装了 anaconda 包 并直接从控制台轻松运行 python 笔记本和 python 脚本 我创建了一个脚本并希望它每天在特定时间段运行 但它不起作用 所以我创建了一个简单的测试文件来检查问题所在 这是我的测试文件 print
  • Android SDK 版本 25 - android.support v7:25 给出“未找到与 @color/hint_foreground_material_light 匹配的资源”Adobe Creative SDK?

    将compileSdkVersion切换到25并使用最新的android support库版本后 在gradle同步 构建时出现以下错误 compile com android support appcompat v7 25 0 0 com
  • 需要有关 Junit 入门的建议

    我之前没有使用过Junit 也没有自动做过单元测试 设想 我们正在将后端 DAO 从 Sql Server 更改为 Oracle 所以在DB端所有的存储过程都被转换为oracle 现在 当我们的代码调用这些 Oracle 存储过程时 我们希
  • 在WPF日历控件中设置显示月份

    当我显示日历时 我默认选择某个日期 myCalendar SelectedDate myDateTime 问题是显示的月份没有改变 它停留在当前月份 我到处寻找一种显示特定月份的方法 如何强制日历显示包含所选日期的月份 您是否尝试过使用Di
  • 无法快照查看 UIKeyboard?

    我有一个访问 iTunes API 的应用程序 我有一个按钮 可以在选择音乐搜索时在音乐应用程序中打开 Apple Music 有时我会收到此错误 当我选择音乐搜索时 它会使应用程序崩溃 Cannot snapshot view
  • 也许是 SQL Server PIVOT?

    SELECT Name1 Name2 Value FROM mytable给我以下结果集 Name1 Name2 Value A P1 1 A P2 1 A P3 2 B P1 3 B P2 1 B P4 1 我如何将其翻译为 A B P1
  • 在文本框上单击,显示(弹出)日历?

    I would like to know how can I implement a calendar when the textbox is clicked Example When I click a textbox the calen
  • Tesseract .NET 处理内存对象中的图像

    据我了解 我可能是错的 Pix LoadFromFile是获取 Pix 进行处理的唯一方法 还有其他方法吗 例如位图 我不是 tesseract 专业人士 但您可以使用以下内容 Bitmap bmp Bitmap Bitmap FromFi
  • 如何在 Windows 上将 Pageant 与 Paramiko 一起使用?

    我知道Paramiko在Windows下支持Pageant 但默认情况下它不起作用 我正在寻找使用 Pageant 中加载的密钥进行连接的示例 这就是我用来连接和自动登录的方法 使用 Pageant 来存储我的密钥 并从我的 Python
  • PHP 错误:已达到最大函数嵌套级别“100”,正在中止[重复]

    这个问题在这里已经有答案了 致命错误 已达到最大函数嵌套级别 100 正在中止 在 project db php 第 2 行 我的 db php 代码 db mysql connect localhost db user password
  • DEBUG_NEW和__FILE__有什么用?

    我看到了以下宏 ifdef DEBUG define new DEBUG NEW UNDEF THIS FILE static char THIS FILE FILE endif 上面的宏有什么用呢 谢谢 DEBUG NEW 只是一个宏 通
  • 什么是匹配函数名称的 Ruby 正则表达式? [复制]

    这个问题在这里已经有答案了 我们的应用程序使用send方法来调用我们对象上的函数 不幸的是 有时字符串传递给send可能不是 Ruby 中的合法方法名称 有谁知道可以让我们检查这个的正则表达式吗 合法的 我的意思是一个不以 开头的方法名称
  • 将现有 Rails 应用程序部署到 AWS Elastic Beanstalk

    我是 Rails 新手 我正在尝试将现有 Rails 应用程序部署到 AWS Elastic Beanstalk 但我得到的只是 祝贺页面 仅供参考 我可以使用 rails server 在 localhost 3000 上运行应用程序 我
  • Node-js 中的异步/等待获取

    const fetch require node fetch async function getPokemon const response await fetch https pokeapi co api v2 pokemon 1 co
  • 使用不同的参数在 python 中调用超类构造函数

    class A def init self x y self x x self y y class B def init self z 0 self z z class AB A B def init self x y z 0 如何使 AB