Python继承结构和参数

2023-12-05

我正在尝试设计一个类结构,允许用户定义自己的类,以重载其他类中的预定义方法。在这种情况下,用户将创建 C 类来重载 D 中的“函数”方法。用户创建的 C 类与其他用户创建的类 A 和 B 具有共同的逻辑,因此它们继承自 C 来重载“函数”,但也继承自D使用D的其他方法。我遇到的问题是如何将“值”从 A 和 B 传递到 D 并忽略将其传递给 C。我当前编写的内容将产生错误,因为 C 没有“值”作为参数。

我知道我可以向 C 的 init 方法和 super 调用添加“值”(或 *args),但我不想知道其他类需要什么输入才能向 A 和 B 添加新类。另外,如果我交换 C 和 D 的顺序,我不会收到错误,但我不会使用 C 的重载“函数”。有一个明显的方法可以解决这个问题吗?

class D(SomethingElse):
    def __init__(self, value, **kwargs):
        super(D, self).__init__(**kwargs)

        self.value = value

    def function(self):
        return self.value

    def other_method(self):
        pass

class C(object):
    def __init__(self):
        super(C, self).__init__()

    def function(self):
        return self.value*2

class B(C, D):
    def __init__(self, value, **kwargs):
        super(B, self).__init__(value, **kwargs)

class A(C, D):
    def __init__(self, value, **kwargs):
        super(A, self).__init__(value, **kwargs)



a = A(3)
print(a.function())
>>> 6

本质上,您需要做两件事来使您的__init__方法在 Python 中与多重继承配合得很好:

  1. 总是采取一个**kwargs参数,并始终调用super().__init__(**kwargs), 即使你认为自己是底层。只是因为你的超类是object并不意味着你是最后一个(之前object) 在里面方法解析顺序.
  2. 不要通过你的父类__init__明确论证;仅通过它们传递**kwargs。您的父类不一定是方法解析顺序中您之后的下一个类,因此位置参数可能会传递给错误的其他类__init__ method.

这称为“合作子类化”。让我们尝试一下您的示例代码:

class D:
    def __init__(self, value, **kwargs):
        self.value = value
        super().__init__(**kwargs)
    
    def function(self):
        return self.value

class C:
    # add **kwargs parameter
    def __init__(self, **kwargs):
        # pass kwargs to super().__init__
        super().__init__(**kwargs)
    
    def function(self):
        return self.value * 2

class B(C, D):
    # don't take parent class's value arg explicitly
    def __init__(self, **kwargs):
        # pass value arg via kwargs
        super().__init__(**kwargs)

class A(C, D):
    # don't take parent class's value arg explicitly
    def __init__(self, **kwargs):
        # pass value arg via kwargs
        super().__init__(**kwargs)

Demo:

>>> a = A(value=3)
>>> a.value
3
>>> a.function()
6

注意value必须传递给A构造函数作为关键字参数,而不是作为位置参数。还建议设置self.value = value打电话之前super().__init__.

我也简化了class C(object): to class C:, and super(C, self)只是super()因为它们在 Python 3 中是等效的。

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

Python继承结构和参数 的相关文章

随机推荐

  • python 中的网页抓取 urlopen

    我正在尝试从该网站获取数据 http www boursorama com includes cours last transactions phtml symbole 1xEURUS 看来 urlopen 没有得到 html 代码 我不明
  • 自定义每个环境执行的 SQL

    我们使用 Flyway 来从 dev gt uat gt prod 推广我们的应用程序 使用 Flyway 来使用轻量级 SQL 数据库 例如 Derby 或 H2 将应用程序部署到开发人员桌面将非常有用 由于各种原因 对于我们的一些开发人
  • 尝试触发任何 Perforce 命令时,每次都必须在命令行中设置端口

    我是 Perforce 的新手 需要在命令行中工作 我很困惑为什么教程网站上的所有命令都写成这样 p4 命令 但每次尝试触发该命令时我都必须添加端口 例如 p4 同步 我必须输入 p4 p myhost myport 每次即使在登录后也会同
  • 附加频率表 - 带有缺失值

    目标是生成一个包含我选择的所有变量 关于 4 份报纸的阅读习惯 的频率表 这些变量本质上具有相同的可能值 1 Subscribed 2 Every week 3 Sometimes 4 Never 0 NA No Answers 如果变量之
  • 在用户控件 asp.net 中使用页面方法的替代方法

    有没有一种方法可以在用户控件内实现页面方法的功能 感谢任何帮助 谢谢 最简单的方法可能是将您想要的功能放入网络服务中 然后使用脚本服务属性以使其可用 工作原理与页面方法非常相似 相当广泛的例子here
  • Java:wait() 是否从同步块中释放锁

    我的印象是 wait 释放所有锁 但我发现这篇文章说 在同步方法内调用 wait 是获取内在锁的简单方法 请澄清我有点困惑 http docs oracle com javase tutorial essential concurrency
  • 将可迭代元素或不可迭代元素展开到数组中,而不检查元素 .length

    Given html div div div div calling document querySelector div 返回第一个div元素 其中 length不是返回值的属性 Calling document querySelecto
  • Oracle:不是按表达式分组错误

    以下是我的查询 我不确定是什么原因导致 Not A group by 表达式错误 任何帮助深表感谢 SELECT c courseID c courseName AVG a Mark as Average Mark FROM course
  • 如何使聊天中的链接可点击

    我的网站上有一个聊天 它从 JSON 文件读取并获取每条消息 然后使用Vue js 但是 我的问题是 当用户发布链接时 它不包含在锚标记中 a href a 因此它不可点击 我看到了这个post 我认为这样的东西会起作用 但是 我不允许向该
  • 如何在 Windows 上设置 gl3w?

    我一直在寻找设置 Gl3w 的详细指南 因为我到处都找不到 首先 下载gl3w https github com skaslev gl3w 然后 下载 Python 3 x https www python org downloads 接下
  • 关于HTML中相对文件路径的问题

    已经有一些关于这个主题的帖子 但对我没有帮助 我已经为 HTML 和 CSS 页面制作了地图结构 但无法将它们相互链接 我的地图结构 采购订单网页设计 Homepage HTML 页面主页 CSS 页面主页 图片主页 Sports HTML
  • Android意图语法

    在我尝试找出如何在应用程序中启动新意图的过程中 我遇到了几种表达它的方法 此语法返回运行时错误 即 ActivityNotFound 异常 Intent in new Intent com something something 当然 我的
  • API设计中如何避免“参数过多”问题?

    我有这个API函数 public ResultEnum DoSomeAction string a string b DateTime c OtherEnum d string e string f out Guid code 我不喜欢它
  • heightForRowAt 与estimatedHeightForRowAt 有什么区别?

    通常当我想设置行高时然后设置 func tableView tableView UITableView heightForRowAt indexPath IndexPath gt CGFloat return 300 受益者是什么estim
  • 将表格从 Word 复制粘贴到 Excel

    我有一个定期更新的word文档 我可以进入该 Word 文档 选择整个表格的内容并复制 然后进入 Excel 电子表格并将其粘贴 搞砸了 但是 我将其修复如下 sht Cells UnMerge sht Cells ColumnWidth
  • 在android中连接到oracle

    所以人们可能会告诉我这是一个坏主意 但我至少想尝试一下 EDIT该应用程序的目的是 仅当设备属于 oracle db 所在网络或通过 VPN 连接到网络时 它才能工作 数据库中的信息无法全局访问 这就是为什么我需要直接连接到 oracle
  • vue,如何动态地、以编程方式、单击将组件添加到 DOM 特定位置?

    我需要添加一个动态导入的组件 只需将虚拟标签添加到 DOM 结构中的特定位置即可 不幸的是 我发现的每一种方法都没有解决我的问题 我首先如何尝试 父组件 Editor vue
  • 当子id包含'.'时sql server中的分层排序

    我有一些像下面这样的孩子 childid 1 1 1 2 2 8 2 7 6 5 6 5 1 6 5 15 7 1 8 排序顺序将是 childid 1 1 1 2 2 7 2 8 6 5 6 51 6 5 15 7 1 我尝试转换为整数
  • 是否可以更改毕加索用于图像的缓存大小?

    我正在使用 Picasso 从 URL http 加载图像 有时 当我尝试使用毕加索的 预加载 图像时fetch 方法 图像不会被缓存 我猜是因为它的尺寸太大了 阅读答案this问题 但是setCache 似乎没有被我认可 我什至没有在毕加
  • Python继承结构和参数

    我正在尝试设计一个类结构 允许用户定义自己的类 以重载其他类中的预定义方法 在这种情况下 用户将创建 C 类来重载 D 中的 函数 方法 用户创建的 C 类与其他用户创建的类 A 和 B 具有共同的逻辑 因此它们继承自 C 来重载 函数 但