在类中设置默认值

2024-05-27

我正在用 Python 创建一个类,但我不确定如何正确设置默认值。我的目标是为所有类实例设置默认值,也可以通过类方法对其进行修改。但是,我希望在调用方法后恢复初始默认值。

我已经能够使用下面所示的代码使其工作。它不是很“漂亮”,所以我怀疑这是解决这个问题的更好方法。

class plots:
    def __init__(self, **kwargs):
        self.default_attr = {'a': 1, 'b': 2, 'c': 3}
        self.default_attr.update(kwargs)
        self.__dict__.update((k, v) for k, v in self.default_attr.items())

    def method1(self, **kwargs):
        self.__dict__.update((k, v) for k, v in kwargs.items())

        #### Code for this method goes here

        # Then restore initial default values
        self.__dict__.update((k, v) for k, v in self.default_attr.items())

当我使用这个类时,我会做类似的事情my_instance = plots() and my_instance.method1(), my_instance.method1(b = 5), and my_instance.method1()。打电话时method1第三次,b如果我不在方法定义末尾重置默认值,则为 5,但我希望它再次为 2。

注意:上面的代码只是一个例子。真实的类有几十个默认值,并且将它们全部用作输入参数将被视为反模式。

关于如何正确解决这个问题有什么建议吗?


有很多方法可以解决这个问题,但是如果你安装了 python 3.7(或者安装了 3.6)向后移植 https://pypi.org/project/dataclasses/), 数据类 https://docs.python.org/3/library/dataclasses.html可能是一个很好的解决方案。

首先,它允许您以可读且紧凑的方式定义默认值,并且还允许您需要的所有突变操作:

>>> from dataclasses import dataclass
>>> @dataclass
... class Plots:
...     a: int = 1
...     b: int = 2
...     c: int = 3
...     
>>> p = Plots()        # create a Plot with only default values
>>> p
Plots(a=1, b=2, c=3)
>>> p.a = -1           # update something in this Plot instance
>>> p
Plots(a=-1, b=2, c=3)

您还可以选择免费定义默认工厂而不是默认值数据类字段定义 https://docs.python.org/3/library/dataclasses.html#dataclasses.field。这可能还不是问题,但它避免了可变默认值陷阱 https://docs.python-guide.org/writing/gotchas/#mutable-default-arguments每个 python 程序员迟早都会遇到这种情况。

最后但并非最不重要的一点是,写一个reset给定现有数据类,函数非常容易,因为它跟踪其中已有的所有默认值__dataclass_fields__属性:

>>> from dataclasses import dataclass, MISSING
>>> @dataclass
... class Plots:
...     a: int = 1
...     b: int = 2
...     c: int = 3
... 
...     def reset(self):
...         for name, field in self.__dataclass_fields__.items():
...             if field.default != MISSING:
...                 setattr(self, name, field.default)
...             else:
...                 setattr(self, name, field.default_factory())
...
>>> p = Plots(a=-1)     # create a Plot with some non-default values  
>>> p
Plots(a=-1, b=2, c=3)
>>> p.reset()           # calling reset on it restores the pre-defined defaults
>>> p
Plots(a=1, b=2, c=3)

现在你可以编写一些函数do_stuff(...)更新 Plot 实例中的字段,只要执行reset()更改不会持续存在。

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

在类中设置默认值 的相关文章

  • Python 中的 Lanczos 插值与 2D 图像

    我尝试重新缩放 2D 图像 灰度 图像大小为 256x256 所需输出为 224x224 像素值范围从 0 到 1300 我尝试了两种使用 Lanczos 插值来重新调整它们的方法 首先使用PIL图像 import numpy as np
  • 将数据从 python pandas 数据框导出或写入 MS Access 表

    我正在尝试将数据从 python pandas 数据框导出到现有的 MS Access 表 我想用已更新的数据替换 MS Access 表 在 python 中 我尝试使用 pandas to sql 但收到错误消息 我觉得很奇怪 使用 p
  • Python(Selenium):如何通过登录重定向/组织登录登录网站

    我不是专业程序员 所以请原谅任何愚蠢的错误 我正在做一些研究 我正在尝试使用 Selenium 登录数据库来搜索大约 1000 个术语 我有两个问题 1 重定向到组织登录页面后如何使用 Selenium 登录 2 如何检索数据库 在我解决
  • 如何在 Python 中检索 for 循环中的剩余项目?

    我有一个简单的 for 循环迭代项目列表 在某些时候 我知道它会破裂 我该如何退回剩余的物品 for i in a b c d e f g try some func i except return remaining items if s
  • 如何替换 pandas 数据框列中的重音符号

    我有一个数据框dataSwiss其中包含瑞士城市的信息 我想用普通字母替换带有重音符号的字母 这就是我正在做的 dataSwiss Municipality dataSwiss Municipality str encode utf 8 d
  • 根据列值突出显示数据框中的行?

    假设我有这样的数据框 col1 col2 col3 col4 0 A A 1 pass 2 1 A A 2 pass 4 2 A A 1 fail 4 3 A A 1 fail 5 4 A A 1 pass 3 5 A A 2 fail 2
  • 如何从网页中嵌入的 Tableau 图表中抓取工具提示值

    我试图弄清楚是否有一种方法以及如何使用 python 从网页中的 Tableau 嵌入图形中抓取工具提示值 以下是当用户将鼠标悬停在条形上时带有工具提示的图表示例 我从要从中抓取的原始网页中获取了此网址 https covid19 colo
  • Flask如何获取请求的HTTP_ORIGIN

    我想用我自己设置的 Access Control Allow Origin 标头做出响应 而弄清楚请求中的 HTTP ORIGIN 参数在哪里似乎很混乱 我在用着烧瓶 0 10 1 以及HTTP ORIGIN似乎是这个的特点之一object
  • Pygame:有没有简单的方法可以找到按下的任何字母数字的字母/数字?

    我目前正在开发的游戏需要让人们以自己的名义在高分板上计时 我对如何处理按键有点熟悉 但我只处理过寻找特定的按键 有没有一种简单的方法可以按下任意键的字母 而不必执行以下操作 for event in pygame event get if
  • IO 密集型任务中的 Python 多线程

    建议仅在 IO 密集型任务中使用 Python 多线程 因为 Python 有一个全局解释器锁 GIL 只允许一个线程持有 Python 解释器的控制权 然而 多线程对于 IO 密集型操作有意义吗 https stackoverflow c
  • 在f字符串中转义字符[重复]

    这个问题在这里已经有答案了 我遇到了以下问题f string gt gt gt a hello how to print hello gt gt gt f a a gt gt gt f a File
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • 每个 X 具有多个 Y 值的 Python 散点图

    我正在尝试使用 Python 创建一个散点图 其中包含两个 X 类别 cat1 cat2 每个类别都有多个 Y 值 如果每个 X 值的 Y 值的数量相同 我可以使用以下代码使其工作 import numpy as np import mat
  • 对年龄列进行分组/分类

    我有一个数据框说df有一个柱子 Ages gt gt gt df Age 0 22 1 38 2 26 3 35 4 35 5 1 6 54 我想对这个年龄段进行分组并创建一个像这样的新专栏 If age gt 0 age lt 2 the
  • 解释 Python 中的数字范围

    在 Pylons Web 应用程序中 我需要获取一个字符串 例如 关于如何做到这一点有什么建议吗 我是 Python 新手 我还没有找到任何可以帮助解决此类问题的东西 该列表将是 1 2 3 45 46 48 49 50 51 77 使用
  • 使用 Python 绘制 2D 核密度估计

    I would like to plot a 2D kernel density estimation I find the seaborn package very useful here However after searching
  • 在 Qt 中自动调整标签文本大小 - 奇怪的行为

    在 Qt 中 我有一个复合小部件 它由排列在 QBoxLayouts 内的多个 QLabels 组成 当小部件调整大小时 我希望标签文本缩放以填充标签区域 并且我已经在 resizeEvent 中实现了文本大小的调整 这可行 但似乎发生了某
  • Python 类继承 - 诡异的动作

    我观察到类继承有一个奇怪的效果 对于我正在处理的项目 我正在创建一个类来充当另一个模块的类的包装器 我正在使用第 3 方 aeidon 模块 用于操作字幕文件 但问题可能不太具体 以下是您通常如何使用该模块 project aeidon P
  • Python Selenium:如何在文本文件中打印网站上的值?

    我正在尝试编写一个脚本 该脚本将从 tulsaspca org 网站获取以下 6 个值并将其打印在 txt 文件中 最终输出应该是 905 4896 7105 23194 1004 42000 放置的动物 的 HTML span class
  • Statsmodels.formula.api OLS不显示截距的统计值

    我正在运行以下源代码 import statsmodels formula api as sm Add one column of ones for the intercept term X np append arr np ones 50

随机推荐

  • 选择 Enum 类型的默认值而无需更改值

    在 C 中 是否可以用属性修饰 Enum 类型或执行其他操作来指定默认值 而不更改值 无论出于何种原因 所需的数字可能是一成不变的 并且仍然可以控制默认值会很方便 enum Orientation None 1 North 0 East 1
  • Android Studio“等待调试器”

    我创建了简单的 你好 世界 使用 android studio 的项目 当我在设备或模拟器上运行它时 一切都很好 然后我尝试在调试模式下运行它 几分钟后屏幕上的 等待调试器 对话框失败并且 Error running test test U
  • 为什么我们要关闭 Mysqli 中的结果

    为什么我们要关闭 result mysqli new mysqli localhost root root test if mysqli gt connect errno echo Failed to connect to MySQL my
  • Freebase RDF 转储的 C# 解析仅产生 1150 万个 N-三元组,而不是 19 亿个

    我正在构建一个 C 程序来读取 RDF 数据Google Freebase 数据转储 https developers google com freebase data 首先 我编写了一个简单的循环来简单地读取文件并获取三元组的计数 然而
  • 控制 HTML 中的图像加载顺序

    有没有办法控制网页上图像的加载顺序 我正在考虑尝试通过首先加载轻量级 加载 图形来模拟预加载器 有任何想法吗 Thanks 使用 Javascript 并填充图像src属性稍后 这 告诉浏览器链接到页面上的 URL 因此不会向服务器发送请求
  • 最小工作聚合物示例

    我一直在尝试使用 Polymer 获得一个极其简单的网页 以便在浏览器中简单地呈现 我在服务器端使用 Node ExpressJS Jade 设置 我的代码与 Polymer 文档附带的示例非常接近 我认为我缺少一些非常简单的东西 我正在使
  • 为什么我不能声明推断类型?

    我有以下内容 runcount Eq a Num b gt a gt b runcount runcountacc 0 runcountacc Eq a Num b gt b gt a gt b runcountacc n runcount
  • 除了在断点处停止之外,如何测量一大块代码的时间?

    我正在 Windows 上开发 C 游戏 模拟 图形应用程序 编辑开始 如果重要的话 我正在使用 Visual Studio 2013 编辑完 Setup 我正在使用 QueryPerformanceCounter 测量从一帧到下一帧的时间
  • Numpy 中矩阵乘以另一个矩阵的每一行

    我有一个大小为 4x4 的齐次变换矩阵和一个大小为 nx3 的轨迹 该轨迹的每一行都是一个向量 我想将齐次变换矩阵乘以轨迹的每一行 下面是代码 append zero column at last trajectory np hstack
  • 无法在 phppgadmin 中编辑或删除数据或行

    当我尝试在 phppgadmin 中编辑数据时 无论哪个表或行 我总是收到以下通知 No unique identifier for this row 并且没有任何更改 保存 我登录的用户对数据库具有完全权限 并且数据库中的所有表都有主键
  • Facebook API 注销我的应用程序,但不注销 Facebook

    如何使用 Facebook 的 api 进行注销 让我退出我的应用程序 网站 但保持登录 facebook com 的状态 这让我登录正常 window fbAsyncInit function FB init appId status t
  • Matplotlib 颤抖比例

    我正在尝试使用 matplotlib 和 quiver 函数绘制一些箭头 但我想使用数组单独选择每个箭头的长度 http matplotlib sourceforge net api pyplot api html matplotlib p
  • Cookie 过期时间格式

    我从谷歌浏览器的 Cookies 文件和其中的一列创建了数据库cookies表是expires utc 该列的格式类似于 13169399213145330 这更像是unix时间 但是当我尝试使用 unix 时间转换器时 它给出了错误的值
  • 接口对象无法扩展 Record

    为什么接口无法扩展Record interface Data a string Data extends Record
  • dplyr 标准评估:summarise_ 以及求和变量的变量名称

    我遇到了很多与我的问题类似的问题 但只解决了我问题的一部分 我使用带有标准评估的 dplyr 来容纳变量名称 这对于管道中的 filter 和 group by 效果很好 但是 为了总结 我无法为我正在求和的指标提供变量名称 一个例子就可以
  • 如何保护 ASP.NET Web API [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想建立一个RESTful使用 ASP NET Web API 的 Web 服务 第三方开发人员将使用该服务来访问我的应用程序的数据
  • 在 UIPickerView 中选择某些内容时发生某些事情

    我正在致力于创建一个使用 UIPickerView 的应用程序 我制作了视图 但我试图让某个按钮改变它的功能 请帮忙 UIPickerView 和许多其他控件使用委托模式来通知您发生的事件 要使用它添加
  • 使用“class-validator”在 TypeScript 中确认密码

    今天 我试图弄清楚如何在应用程序的后端 NestJS 验证注册表单 我只是想知道是否存在一种验证方法password and passwordConfirm匹配 使用class validator包来构建自定义验证器或利用提供的验证器 我正
  • 会话变量由于某种原因丢失

    我尝试建立一个电子商店 每件物品旁边都有一个asp imagebutton单击此图像按钮时 我正在检查会话变量是否session basket 是否存在 如果不存在 则我将值添加到列表 实体类 中 然后在会话中添加此列表 如果会话不为空 那
  • 在类中设置默认值

    我正在用 Python 创建一个类 但我不确定如何正确设置默认值 我的目标是为所有类实例设置默认值 也可以通过类方法对其进行修改 但是 我希望在调用方法后恢复初始默认值 我已经能够使用下面所示的代码使其工作 它不是很 漂亮 所以我怀疑这是解