将全局变量传递给类和函数的替代方法

2024-01-04

我是 python 新手,我一直在使用global将变量传递给其他函数被认为是新手,也是一种不好的做法。我想不再使用全局变量,但我不知道该怎么做。

现在,我有一个在 wxPython 中创建的 UI 作为其自己的单独类,并且我有另一个从 .ini 文件加载设置的类。由于 UI 中的设置应与 .ini 中的设置相匹配,因此如何传递这些值?我可以使用类似的东西:Settings = Settings()然后将变量定义为类似的东西self.settings1,但是我必须做Settings一个全局变量,将其传递给我的 UI 类(如果我在其中分配,则不会是这样)main()).

那么传递这些变量的正确且Python式的方法是什么?

Edit:这是我正在使用的代码,我正在尝试让它像 Alex Martelli 的示例一样工作。以下代码保存在Settings.py:

import ConfigParser

class _Settings():
    @property
    def enableautodownload(self): return self._enableautodownload
    def __init__(self):
        self.config = ConfigParser.ConfigParser()

        self.config.readfp(open('settings.ini'))
        self._enableautodownload=self.config.getboolean('DLSettings', 'enableautodownload')

settings = _Settings()

每当我尝试参考Settings.settings.enableautodownload从另一个文件我得到:AttributeError: 'module' object has no attribute 'settings'。我究竟做错了什么?

Edit 2:别介意这个问题,我重新输入了代码,现在它可以工作了,所以它一定是一个简单的拼写或语法错误。


的替代方案global变量有很多——主要是:

  • 函数的显式参数、调用来创建其实例之一的类等(这通常是最清晰的,因为它使依赖关系最显式,在可行且不太重复的情况下);
  • 对象的实例变量,当需要访问这些值的函数是同一对象上的方法时(这也可以,并且是使用 OOP 的合理方法);
  • 提供值的“访问器函数”(或具有值的属性或属性的对象)。

其中每一个(尤其是第一个和第三个)对于其名称必须的值特别有用not可以被所有人重新绑定,但只能访问。真正的大问题是global是它提供了一个“隐蔽的通信通道”(不是密码学意义上的,而是字面意义上的:表面上独立的函数实际上可以通过函数中不“明显”的全局值相互依赖、相互影响' 签名——这使得代码难以测试、调试、维护和理解)。

对于您的具体问题,如果您从不使用global语句,而是从任何地方以“只读”方式访问设置(并且您可以通过使所述对象的属性成为只读属性来更充分地确保这一点!),然后执行“只读”访问一个单一的、一次制作就不再更改的模块级实例还不错。即,在某些模块中foo.py:

class _Settings(object):
    @property
    def one(self): return self._one
    @property
    def two(self): return self._two
    def __init__(self, one, two):
       self._one, self._two = one, two
settings = _Settings(23, 45)

以及来自其他地方的,import foo然后只需访问foo.settings.one and foo.settings.two如所须。请注意,我用一个前导下划线命名该类(就像只读属性下面的两个实例属性一样),以表明它不应该从模块“外部”使用——只能在settings对象应该是(没有强制执行——但任何侵犯此类请求隐私的用户显然是唯一对可能发生的混乱负责的一方;-)。

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

将全局变量传递给类和函数的替代方法 的相关文章

  • 获得熊猫按群体连续几周的最长连续记录

    目前我正在处理不同主题的每周数据 但可能会有一些没有数据的长连续 所以 我想做的就是保留每个连续几周的最长连续id 我的数据如下所示 id week 1 8 1 15 1 60 1 61 1 62 2 10 2 11 2 12 2 13 2
  • 为什么Python中的打印需要三个撇号?

    我正在用 Python 3 3 2 制作这个毕达哥拉斯定理计算器 我打印了几行 以便我可以制作图表 print Welcome to the Pythagoras Theorem Calculator powered by Python p
  • Keras 中的 load_model 和 Lambda 层

    如何加载具有 lambda 层的模型 这是重现行为的代码 MEAN LANDMARKS np load data mean shape 68 npy def add mean landmarks x mean landmarks np ar
  • 使用 JSON 将数据从 Python 导出到 Tableau?

    如何以表格形式从 Python 获取 400 万行和 28 列 我假设 基于搜索 我应该使用 JSON 格式 这种格式可以处理大量数据并且足够快 我制作了 12 行数据的子集并尝试使其正常工作 好消息是 它正在发挥作用 坏消息 不是我想要的
  • 当鼠标悬停时使用 matplotlib 注释绘图的线条[重复]

    这个问题在这里已经有答案了 我想在鼠标悬停时在绘图上注释不同的线 这里用点进行相同的操作当鼠标悬停在 matplotlib 中的某个点上时可以显示标签吗 https stackoverflow com questions 7908636 p
  • Python2 math.fsum 不准确?

    我正在使用 python2 数学模块来计算 fsum 的总和 据我所知 0 1通常不能存储二进制 据我了解 math fsum 应该以某种方式解决这个问题 import math math fsum 0 0 0 1 0 1 math fsu
  • 如何显示 pymongo.errors.OperationFailure 详细信息?

    写入 MongoDB 时 我在 python 中遇到 pymongo OperationsFailure 除了回溯之外 还有没有办法打印出详细信息或代码属性 另请参阅 http api mongodb org python current
  • 在ubuntu中安装pyinterval

    我正在尝试安装 python 库 pyinterval 它需要 crlibm C 标头 我已安装该标头 没有错误 但似乎是问题的根源 当我跑步时 sudo easy install pyinterval 我得到以下信息 Searching
  • 尝试打开 Excel 时出现“KeyError:“存档中没有名为“xl/sharedStrings.xml”的项目”

    我正在尝试使用 Python 脚本将数据导入 PowerBi 以便我可以安排它定期刷新数据 我面临着从 Excel 文件获取数据并收到错误的挑战 KeyError 没有名为 xl sharedStrings xml 的项目在档案中 导入时
  • 从两个列表中查找总和等于 x 的 2 个数字的最快方法

    我的代码 n 3 a1 0 b1 10 a2 2 b2 2 if b1 gt n b1 n if b2 gt n b2 n diap1 x for x in range a1 b1 1 diap2 x for x in range a2 b
  • AMLS 实验运行停留在“正在运行”状态

    我运行了 Azure 机器学习服务实验 并使用 Jupyter Notebook 记录了神经网络损失 日志记录工作正常 神经网络训练也按预期完成 但实验一直停留在运行状态 关闭计算资源不会关闭实验运行 我无法从实验面板取消它 此外 运行没有
  • 如何实例化具有已知系数的 Scikit-Learn 线性模型而不进行拟合

    背景 作为实验的一部分 我正在测试各种保存的模型 但其中一个模型来自我编写的算法 而不是来自 sklearn 模型拟合 但是 我的自定义模型仍然是线性模型 所以我想实例化一个LinearModel实例并设置coef and intercep
  • 视频的 EXIF 之类的东西

    有没有从视频文件中获取信息的标准方法 对于图像 我们有 EXIF 数据 可用于获取有关图像文件的日期 时间 大小等信息 我想知道视频是否也有这样的东西 用例是 我有很多用数码相机拍摄的视频 我想将它们重命名为更有意义的名称 例如 YYYY
  • 如何使用 BeautifulSoup 排除表中的某些行?

    我已经从表格中获得了所需的数据 但不想要各个玩家统计数据之间的缩写 Rk Pos Name 等 如何在保留所需数据的同时排除这些数据 包含缩写的行被归类为 thead 但我不知道如何使用该信息来跳过它 我知道玩家的数据都被压缩在一起 但现在
  • Pygame - 两个圆圈的碰撞检测

    我正在制作一个碰撞检测程序 其中我的光标是一个半径为 20 的圆 当它碰到另一个圆时应该将值更改为 TRUE 出于测试目的 我在屏幕中心有一个半径为 50 的固定圆 我可以测试光标圆是否击中固定圆 但它不能正常工作 因为它实际上是在测试它是
  • Python条件运算符“if else”不等于“and or”[重复]

    这个问题在这里已经有答案了 我认为下面两个函数的结果会相同 但事实并非如此 def fib2 n return n and n lt 2 or fib2 n 1 fib2 n 2 def fib3 m return m if m lt 2
  • 重置Keras模型的所有权重

    我希望能够重置整个 Keras 模型的权重 这样我就不必再次编译它 编译模型目前是我的代码的主要瓶颈 这是我的意思的一个例子 import tensorflow as tf model tf keras Sequential tf kera
  • 无法通过蓝牙读取心率服务

    我希望创建一个简单的 python 脚本 通过蓝牙从 Polar 传感器读取心率数据 我已经阅读了很多其他帖子 但找不到我能够成功执行的简单内容 我有 Polar 可穿戴设备的设备 MAC 地址 我知道我想要读取的值的服务 UUID HR
  • python chaco轴标签时间格式

    在 Enthought 的 Chaco 中 TimeFormatter类用于格式化刻度的时间字符串 标签 有没有办法指定时间格式 类似于time strftime 源代码现在将显示月份和日期时的格式硬编码为美国风格 MMDD 我想添加一些灵
  • Doctest 返回失败,但“预期”和“得到”完美匹配

    我正在尝试做列表部分的第二个练习 http www openbookproject net thinkcs python english2e ch09 html exercises 如何像计算机科学家一样思考 一书的内容 我基本上必须将给定

随机推荐

  • 无法使用 Android 版 Chrome 播放 blob-url 视频

    我在尝试在 Android 版 Chrome 中录制和播放视频时遇到了一个不寻常的问题 相同的代码在桌面版 Chrome 上运行良好 首先 一些信息 安卓4 4 2 适用于 Android 的 Chrome 40 0 2214 89 它适用
  • Kubernetes 中的一个节点上仅允许一个类型的 pod

    如何在 Kubernetes 中的一个节点上仅允许一个类型的 pod 守护进程集不适合此用例 例如 限制一个节点上仅调度一个 Elasticsearch pod 以防止节点出现故障时数据丢失 可以通过仔细规划Pod的CPU 内存资源和集群的
  • 钥匙斗篷|无法在异步函数中等待 updateToken()

    我们正在使用 React Redux 前端开发 Spring 应用程序 我们成功地将其与 Keycloak 身份验证服务集成 但是 访问令牌超时后 我们遇到了不需要的行为 我们的restMiddleware 看起来像这样 简化 functi
  • 将其他分支重置为当前分支,无需签出

    我正在为我的 Git 工作流程编写一些脚本 我需要将其他 现有 分支重置为当前分支 而无需签出 Before CurrentBranch commit A OtherBranch commit B After CurrentBranch c
  • 如何通过js启用/禁用浏览器历史记录

    我们可以通过java脚本代码启用或禁用浏览器历史记录吗 如果可能的话请告诉我执行此操作的机制 我认为这是不可能的 你可以尝试使用document location replace 它用于清除历史记录中的最后一个条目并将其替换为新 url 的
  • 在 PHP 7.4 中生成 SOAP 数组

    我一直在工作项目中使用 SOAP API 我很幸运 WSDL 基本上毫无意义 因为请求的正文是
  • C++11 线程不能与虚拟成员函数一起使用

    我试图让一个类运行一个线程 它将在循环中调用一个名为 Tick 的虚拟成员函数 然后我尝试派生一个类并重写 base Tick 但在执行时 程序只是调用基类的 Tick 而不是覆盖它 有什么解决办法吗 include
  • 尝试在单独的工作表中复制粘贴单元格时出现 VBA 运行时错误 1004

    目前 我的 VBA Excel 2007 代码中出现以下错误 运行时错误 1004 对象 Worksheet 的方法 Range 失败 在通过标题中的这个错误解决了相当多的问题后 我还没有找到类似的情况或解决我的问题的方法 也就是说 如果不
  • Android:带有 FragmentTabHost 的底部选项卡

    我试图将 FragmentTabHost 放在屏幕底部 不久前 我能够使用常规 TabHost 做到这一点 如下这个线程 https stackoverflow com questions 2395661 android tabs at t
  • +1 和 -1 之间的差异

    gt t 1 1 Num a gt a gt a gt t 1 1 Num a gt a 为什么第二个不是函数 我必须写吗 1 或者 还有更好的方法 这是因为 1 然而被解释为消极的 1 被解释为柯里化函数 x gt 1 x 在哈斯克尔中
  • 如何将 Visual Studio 附加到尚未启动的进程?

    我的 NET 程序由于某些原因无法从 Visual Studio 运行 从 Excel 2010 模板项目创建的 Excel 文件 我需要调试启动事件 如果我想调试程序初始化后发生的事件 那么没有问题 我从资源管理器运行该程序 将进程附加到
  • 如何在Android-ndk中将变量内容输出到“LogCat”窗口

    我在 Eclipse ADT 环境中使用 Android sdk ndk 在Android sdk Java开发中 我可以使用 Log i Log w 语句将消息和变量内容输出到 LogCat 窗口 然而 在Android ndk C C
  • 创建按字母顺序索引的列表 (ColdFusion + Microsoft SQL Server)

    我目前正在努力寻找知道如何做到这一点的人 我尝试了几种不同的方法 最终得到了一半的结果 但并不完全是我想要的 基本上我正在尝试创建一个显示所有乐队 A Z 的列表 但乐队名称是从数据库中调用的 所以我必须在嵌套列表中使用 band name
  • 如何验证“Cache-Control”、“无缓存、无存储、必须重新验证”

    我正在学习缓存以及如何管理它 当我打开网站页面时 我可以看到图像 css 文件 js 文件等静态内容存储在临时文件夹中 但现在 当我在响应标头中添加这些属性时 我看不到缓存行为的任何变化 所有内容都像以前一样被存储 即使我在 js 文件中进
  • Thymeleaf:我可以在表达式中使用消息吗

    我在 Spring Boot 应用程序中使用 Thymeleaf 3 目前 我想在 EL 表达式 Spring EL 中使用消息表达式 第一个用例 修剪消息 data title message key trim 第二个用例 有条件地创建一
  • 如何停止工作表中的程序执行?

    如何在 Scala 工作表中停止程序执行 如果代码正在执行并且不返回 无限循环 那么似乎不可能在不重新启动 Eclipse 的情况下停止程序执行 From https github com scala ide scala worksheet
  • 如何在 Linux 中终止单个 TCP 连接?

    我有一个进程在不同的端口上打开到多个浏览器的多个 tcp 连接 使用 netsat 的输出是这样的 tcp 0 0 server1 something myprog client1 something 49987 ESTABLISHED t
  • jQuery DataTables - 启动缓慢,“正常”html 表显示在开头

    我正在使用 jQuery DataTable 插件 但我担心脚本加载似乎需要一些时间 所以我的网页总是首先显示普通的 html 表格 在所有脚本完成后 该表格将变成 DataTable 我觉得这种样子不太能接受 所以希望能在这里得到一些建议
  • 在 IOS 上启用语音时,移动菜单无法打开

    我正在使用 Safari 浏览器在 ios 中打开我的网站 移动菜单工作正常 当我点击菜单图标 三行图标 时它会打开 但是 当我启用语音然后进入浏览器并点击该菜单图标时 移动菜单未打开 这是CSS问题还是我必须添加一些aria属性 有人能帮
  • 将全局变量传递给类和函数的替代方法

    我是 python 新手 我一直在使用global将变量传递给其他函数被认为是新手 也是一种不好的做法 我想不再使用全局变量 但我不知道该怎么做 现在 我有一个在 wxPython 中创建的 UI 作为其自己的单独类 并且我有另一个从 in