继承最佳实践:*args、**kwargs 或显式指定参数 [关闭]

2024-01-06

我经常发现自己覆盖了父类的方法,并且永远无法决定是否应该显式列出给定的参数或仅使用毯子*args, **kwargs构造。一个版本比另一个版本更好吗?有最佳实践吗?我缺少哪些(不利)优势?

class Parent(object):

    def save(self, commit=True):
        # ...

class Explicit(Parent):

    def save(self, commit=True):
        super(Explicit, self).save(commit=commit)
        # more logic

class Blanket(Parent):

    def save(self, *args, **kwargs):
        super(Blanket, self).save(*args, **kwargs)
        # more logic

显式变体的感知好处

  • 更明确(Python 之禅)
  • 更容易掌握
  • 功能参数很容易访问

毯子变体的感知好处

  • more DRY
  • 父类很容易互换
  • 父方法中默认值的更改会在不触及其他代码的情况下传播

里氏替换原则

通常,您不希望方法签名在派生类型中发生变化。如果您想交换派生类型的使用,这可能会导致问题。这通常被称为里氏替换原则 http://en.wikipedia.org/wiki/Liskov_substitution_principle.

显式签名的好处

同时,我认为您的所有方法都有以下签名是不正确的*args, **kwargs。显式签名:

  • 通过良好的参数名称帮助记录方法
  • 通过指定需要哪些参数以及哪些参数具有默认值来帮助记录该方法
  • 提供隐式验证(缺少必需的参数会引发明显的异常)

可变长度参数和耦合

不要将可变长度参数误认为是良好的耦合实践。父类和派生类之间应该有一定程度的内聚力,否则它们不会相互关联。相关代码产生反映内聚程度的耦合是正常的。

使用可变长度参数的地方

使用可变长度参数不应该是您的首选。当您有充分的理由时应该使用它,例如:

  • 定义函数包装器(即装饰器)。
  • 定义参数多态函数。
  • 当您可以采用的参数确实是完全可变的时(例如广义的数据库连接函数)。 DB连接函数通常需要一个连接字符串 http://en.wikipedia.org/wiki/Connection_string有许多不同的形式,包括单参数形式和多参数形式。对于不同的数据库也有不同的选项集。
  • ...

你做错了什么吗?

如果您发现经常创建采用许多参数的方法或具有不同签名的派生方法,那么您在如何组织代码方面可能会遇到更大的问题。

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

继承最佳实践:*args、**kwargs 或显式指定参数 [关闭] 的相关文章

  • 以 str.format 切片字符串

    我想实现以下目标str format x y 1234 5678 print str x 2 str y 2 我能够做到这一点的唯一方法是 print 0 1 format str x 2 str y 2 现在 这是一个例子 我真正拥有的是
  • 如何将 UPX 与 pyinstaller 一起使用?

    如何将 UPX 与 pyinstaller 一起使用 我正在关注文档 我已经下载了UPX 我的文件如下所示 import csv import selenium import pandas print Hello 然后我运行 pyinsta
  • python中嵌套字典值的总和

    我有一本这样的字典 data 11L a 2 b 1 a 2 b 3 22L a 3 b 2 a 2 b 5 a 4 b 2 a 1 b 5 a 1 b 0 33L a 1 b 2 a 3 b 5 a 5 b 2 a 1 b 3 a 1 b
  • 使用 Python 将阿拉伯语或任何从右到左书写系统的字符串打印到 Linux 终端

    非常简单的例子是 city print city 我期望输出是 但实际上输出是相反的字符串 字母看起来有点不同 因为它们有开始 中间和结束形式 我无法将其粘贴到此处 因为复制粘贴会再次更正字符串的顺序 如何在 Linux 终端上正确打印阿拉
  • 按字符串子字符串的列过滤 Pandas 数据框

    我正在尝试使用列中的字符串值是数据框外部字符串的子字符串的条件来过滤数据框 下面的例子 df a b c hello bye hello reference str hello there output a c 一种方法可能是使用正则表达式
  • python - 将cookie添加到cookiejar

    如何在 python 中创建 cookie 并将其添加到 CookieJar 实例 我拥有 cookie 的所有信息 名称 值 域 路径等 但我不想通过 http 请求提取新的 cookie 我尝试了这个 但看起来 SimpleCookie
  • 使用 argparse 指定默认文件名,但不使用 --help 打开它们?

    假设我有一个对文件执行一些操作的脚本 它在命令行上获取此文件的名称 但如果未提供 则默认为已知文件名 content txt 说 与蟒蛇的argparse 我使用以下内容 parser argparse ArgumentParser des
  • Django Rest Framework 序列化器中的聚合(和其他带注释的)字段

    我正在尝试找出添加带注释字段的最佳方法 例如将任何聚合 计算 字段添加到 DRF 模型 序列化器 我的用例只是一种情况 端点返回的字段未存储在数据库中 而是从数据库计算得出 让我们看下面的例子 模型 py class IceCreamCom
  • 如何使直方图列的宽度都相同

    我在操作直方图时遇到了一些麻烦 我有一个包含两列的 df 我将它们绘制为堆叠直方图 我将它们放入特定的垃圾箱中 请参阅下面的代码 但我想在最后制作一个大垃圾箱 4000 10000 但是 默认情况下 大垃圾箱的列宽很大 有没有办法让这个大垃
  • 导入我自己的模块时出现“ImportError:没有名为...的模块”

    我正在尝试导入模块 但不断收到导入错误 在 PortfolioStatus py 文件中 我有以下代码 它从 share data py 模块导入 share data 类 from Shares share data import sha
  • 保存游戏最高分?

    我使用 pygame 在 python 中制作了一个非常简单的游戏 分数取决于玩家达到的级别 我将级别作为变量称为score 我想在游戏开始或结束时显示顶级 我会更乐意显示多个分数 但我见过的所有其他线程都太复杂 我无法理解 所以请保持简单
  • 收到“/:未找到事件。”使用 PyCharm 远程调试器时

    当我使用 PyCharm 通过 ssh 进行远程调试时tcsh shell 服务器 很多时候它停止工作 并显示 未找到事件 更具体地说 我在 pycharm 调试控制台中遇到以下内容 ssh username hostserver 22 p
  • 尝试将 cuda 与 pytorch 一起使用时出现运行时错误 999

    我为我的 Geforce 2080 ti 安装了 Cuda 10 1 和最新的 Nvidia 驱动程序 我尝试运行一个基本脚本来测试 pytorch 是否正常工作 但出现以下错误 RuntimeError cuda runtime erro
  • pandas-更改重采样时间序列的开始和结束日期

    我有一个时间序列 我将其重新采样到这个数据框中df 我的数据是从6月6日到6月28日 它希望将数据从6月1日延长到6月30日 计数列仅在较长时间内具有 0 值 而我的实际值是从 6 日到 28 日 Out 123 count Timesta
  • 返回吃异常

    我至少发现了以下行为weird def errors try ErrorErrorError finally return 10 print errors prints 10 It should raise NameError name E
  • 执行许多插入重复键更新错误:未使用所有参数

    所以我一直在尝试使用 python 2 7 15 使用 mysql connector 执行此查询 但由于某种原因 它似乎不起作用并且总是返回错误 并非所有参数都被使用 表更新有一个主键 即 ID 这是我尝试运行此 SQL 的查询 sql
  • 如何使用 PyAudio 选择特定的输入设备

    通过 PyAudio 录制音频时 如何指定要使用的确切输入设备 我的电脑有两个麦克风 一个内置 一个通过 USB 我想使用 USB 麦克风进行录音 这流类 https people csail mit edu hubert pyaudio
  • 设置字符串中单词或字符数的限制

    假设我有一个字符串元素列表 wordlist hi what s up home diddle mc doo Oh wise master kakarot hello have a da 我希望列表中的每个元素最多包含 3 个单词或 20
  • 混合两个列表的Pythonic方法[重复]

    这个问题在这里已经有答案了 我有两个长度为 n 和 n 1 的列表 a 1 a 2 a n b 1 b 2 b n 1 我想要一个函数作为结果给出一个列表 其中包含两个中的替代元素 即 b 1 a 1 b n a n b n 1 以下方法有
  • 真实值与预测值的降维可视化

    我有一个数据框 如下所示 label predicted F1 F2 F3 F40 major minor 2 1 4 major major 1 0 10 minor patch 4 3 23 major patch 2 1 11 min

随机推荐

  • 如何显示 Google 字体预览

    我正在将 Google 字体系列名称加载到选择列表中 当用户从列表中选择任何字体系列时 我会动态加载该字体 我的代码 get https www googleapis com webfonts v1 webfonts key functio
  • CakePHP 单元测试装置名称约定 啊?

    我一直在用头撞墙 试图找出为什么我的灯具无法正确加载 当我尝试运行测试时 会呈现我的布局 如果我注释掉该装置 测试就会正常运行 我已经把这个问题看了一百遍了 但我似乎看不出哪里出了问题 这是我的 Videosview test php Ap
  • 如何定量测量源和显示器之间的 gstreamer H264 延迟?

    我有一个项目 我们使用 gstreamer x264 等将视频流通过本地网络多播到多个接收器 连接到显示器的专用计算机 我们在视频源 摄像机 系统和显示监视器上使用 gstreamer 我们使用 RTP 有效负载 96 和 libx264
  • 在 Base SAS 中,如何自动刷新资源管理器?

    我相当确定这一定是困扰其他人的问题 因此必须有一个解决方案 我编写代码并想要快速检查数据集 但它不存在 我需要选择窗口 单击 查看 然后单击 刷新 是否有我可以使用的键盘快捷键或我可以编写的宏来为我做到这一点 我知道这很懒 但它让我烦恼 任
  • 按日期绘制 Twitter 搜索结果的词云? (使用R)

    我希望在 twitter 上搜索一个单词 假设是 google 然后能够生成 twitts 中使用的单词的标签云 但是根据日期 例如 有一个小时的移动窗口 移动时间为每次 10 分钟 并向我展示不同的单词如何在一天中被更频繁地使用 对于如何
  • 如何将 WindowsIdentity 转换为 NetworkCredential?

    我们如何转换一个WindowsIdentity to a NetworkCredential 我正在测试我的 WCF 服务以验证匿名调用者是否被阻止 为此 我想做类似的事情 myProxy ClientCredentials Windows
  • jquery在不同领域检测常用词

    在 jquery 中 如何确定一个元素是否使用了另一个元素中正在使用的单词 例如 如果一个字段包含值 fishbucket 而另一个字段包含fishdome 那么您将如何扫描这两个字段来获取常用词 在本例中为 fish 或者即使是数字 假设
  • 定位jar包内的资源

    我有一个静态类 在该类中图像被加载到 BufferedImage 对象中 如下所示 File groundTopImageFile new File src main resources ground grass top png 现在 当我
  • 在 OCaml 中模拟 try-with-finally

    OCaml s try with不提供finally像Java这样的子句 不过 它会很有用 尤其是在处理副作用时 例如 我喜欢打开一个文件 将打开的文件传递给一个函数 然后关闭它 如果函数引发异常 我必须捕获它才能有机会关闭文件 当打开多个
  • 三.js。应用 EdgesHelper 后更改网格位置

    我尝试在应用 EdgesHelper 后旋转或更改网格的位置 但它不起作用 网格保持在同一位置 没有 EdgesHelper 它工作正常 我究竟做错了什么 var mesh new THREE Mesh geometry material
  • 从元组中获取元素[重复]

    这个问题在这里已经有答案了 可能的重复 为什么 ADL 找不到函数模板 https stackoverflow com questions 2953684 why doesnt adl find function templates Cal
  • 不允许设置设备所有者

    我知道有人提出了问题 但我无法获得设备所有权 我使用的是三星 xcover 4 安卓 7 0 我启动这个命令 C Users xxx AppData Local Android Sdk platform tools gt adb shell
  • 如何为所有 NDB 数据存储条目分配默认值?

    我必须向现有的 NDB 类添加一个新属性 class AppList ndb Model ignore ndb BooleanProperty default False new property 然后我将像下面这样使用它 entries
  • 按住鼠标左键时不会生成 WM_MOUSELEAVE

    在我的 Win32 应用程序中 当我按住鼠标左键并快速将鼠标指针移出窗口时 我没有收到 WM MOUSELEAVE 消息 但是如果我按住鼠标左键 从窗口内部开始并缓慢移动经过窗口边缘 它将生成一个 WM MOUSELEAVE 如果我不按住鼠
  • 从 UUID 版本 1 获取 UNIX 时间戳

    在我们的 Java 应用程序中 我们尝试从 UUID 获取 UNIX 时间版本1 https en wikipedia org wiki Universally unique identifier Version 1 date time a
  • 将 List 传递给 String... 参数

    我正在努力将字符串列表传递到需要参数的方法中 细绳 有人可以帮我吗 How to put names into dummyMethod List
  • Netbeans 新建项目向导不显示 Maven Web 应用程序

    我已经阅读了与此相关的其他问题 所以这不是另一个重复 在 Netbeans 8 0 中使用 新建项目向导 时 我选择Maven但我无法选择Web应用程序 它根本不显示 所以我问谷歌 它告诉我安装JAVA EE And I did但 Mave
  • 在 Google Colab Notebook 中提供 Iframe:本地主机拒绝连接

    我正在尝试使用以下内容从 Google Colab 笔记本提供一些 HTML from IPython display import IFrame IFrame src output index html width 700 height
  • 如何在相关实体中搜索(Hibernate 搜索)

    我没有尝试这个东西 我的要求是按名称搜索记录 以下是我的相关课程 记录文件夹分析 java Indexed public class RecordFolderAnalysis extends AuditableEntity implemen
  • 继承最佳实践:*args、**kwargs 或显式指定参数 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我经常发现自己覆盖了父类的方法 并且永远无法决定是否应该显式列出给定的参数或仅使用毯子 args kwargs构造 一个版本比另一个版本更好吗