我应该使用属性还是 getter 和 setter?

2023-11-21

我知道在 python 中使用 getter 和 setter 不是 pythonic。相反,应该使用属性装饰器。但我想知道以下场景 -

我有一个使用一些实例属性初始化的类。然后我需要向类添加其他实例属性。如果我不使用设置器,那么我必须写object.attribute = value课堂之外的任何地方。班级不会有self.attribute代码。当我需要跟踪类的属性时(因为它们散布在类外部的代码中),这不会成为问题吗?


一般来说,您甚至不应该使用属性。简单的属性在绝大多数情况下都可以正常工作:

class X:
    pass

>>> x = X()
>>> x.a
Traceback (most recent call last):
  # ... etc
AttributeError: 'X' object has no attribute 'a'
>>> x.a = 'foo'
>>> x.a
'foo'

仅当您满足以下条件时才应使用财产:need访问属性时做一些工作:

import random

class X:

    @property
    def a(self):
        return random.random()

>>> x = X()
>>> x.a
0.8467160913203089

如果您还需要能够分配给属性,则定义 setter 很简单:

class X:

    @property
    def a(self):
        # do something clever
        return self._a

    @a.setter
    def a(self, value):
        # do something even cleverer
        self._a = value

>>> x = X()
>>> x.a
Traceback (most recent call last):
  # ... etc
AttributeError: 'X' object has no attribute '_a'
>>> x.a = 'foo'
>>> x.a
'foo'

请注意,在每种情况下,客户端代码访问特性或属性的方式完全相同。没有必要让你的类“面向未来”,以防在某些时候你可能想做一些比简单属性访问更复杂的事情,所以没有理由编写属性、getter 或 setter除非你现在确实需要它们.

有关属性、getter 和 setter 方面惯用的 Python 和其他一些语言之间的差异的更多信息,请参阅:

  • 为什么你不需要 getter 和 setter?
  • Python 不是 Java(尤其是“Getters 和 Setters 是邪恶的”部分)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我应该使用属性还是 getter 和 setter? 的相关文章

随机推荐

  • 如何在父元素和父元素的兄弟元素上方显示子元素?

    我的问题与这个问题相关 使用 CSS 在父元素上方显示子元素 该问题的答案 设置overflow visible 仅适用于一个孩子的一位家长 然而 我有这些元素的行 我需要孩子显示在父母上方的父母行 我可以让孩子显示在原始父母之上 但我无法
  • Oozie/yarn:src 文件系统上的资源已更改

    我有一个 Oozie 工作流程 其中一个步骤是 java 步骤 运行存储在本地文件系统上的 jar 该 jar 存在于所有节点上 最初 该 jar 是通过 RPM 安装的 因此它们都具有相同的时间戳 在实验时 我手动复制了这个 jar 的新
  • 样式需要时间加载 - Next.js

    当我输入我的作品集时 它会加载未样式化的 html 页面 并且仅在几秒钟后才会加载样式 我该如何解决这个问题 注意 我正在使用样式组件 When I enter the page After a few seconds 我尝试寻找样式组件与
  • Android:蓝牙 UUID 如何工作?

    我不明白蓝牙 UUID 表示什么 UUID 是否表示协议 例如RFCOMM 如果是这样 为什么要这样做createRfcommSocketToServiceRecord 方法需要 UUID 当它们在名称中指定 rfcomm 时 为什么 Bl
  • Android 上的方位角/偏航角和滚动角方向传感器值不一致

    我无法获得良好的方向传感器读数 传感器读数似乎不可靠 因此我针对两个免费的传感器测试应用程序测试了我的代码 传感器测试仪 Dicotomica and 传感器监控 R 的软件 我发现 虽然我的读数通常与传感器测试应用程序一致 但有时方位角
  • XFetchName 始终返回 0

    我试图编写一个 C 代码来获取 Linux 系统中活动窗口的标题 但函数 XFetchName 总是返回零 我也尝试过 XGetWMName 相同的结果 但是使用 xprop 我可以看到 WM NAME 属性中有一个字符串 谁能告诉我我的代
  • Magento:如何将配置更改从开发环境迁移到生产环境?

    我们正在积极开发模块 当我们将更改推送到生产站点时 通常需要进行多项配置更改 自动化这个 想法会很好吗 不确定它是否仍然是实际的 但如果您的意思是对系统 gt 配置进行更改 那么使用此类 config xml 节点而不是编写数据库升级要好得
  • Spring Boot 与 AngularJS html5Mode

    我使用 Spring Boot 启动我的 Web 应用程序 它使用一个简单的主类来启动嵌入式 tomcat 服务器 Configuration EnableAutoConfiguration ComponentScan public cla
  • 如何以编程方式设置新的 Woocommerce 产品创建的类别?

    这里提出的解决方案允许我轻松地为 WordPress 帖子创建 类别 Check if category already exists cat ID get cat ID category If it doesn t exist creat
  • FileStream.BeginWrite 相对于 FileStream.Write 的优势?

    我需要对同一个文件进行批量写入 但在文件中的不同位置 我希望以尽可能最佳的性能来实现这一点 因此研究了同步 FileStream Write 和异步 FileStream BeginWrite 方法 同步实现很简单 只需在循环中调用 Fil
  • 如何声明具有变量泛型的映射?

    我有一个Map其键是泛型类型Key
  • 如何在 Angular 2 的组件中使用管道?

    我有一个管道类 它根据您传递的参数返回数据 我知道如何在我的 HTML 模板中使用它 符号 但我也想在我的组件中使用它 有没有办法直接从 Angular 2 中的组件或服务内部调用管道 您可以使用以下命令直接在代码中调用管道 YourPip
  • 重新加载完成时的 jqgrid 事件?

    我正在使用jqgrid 我可以看到我有多少行 如下所示 grid getGridParam records 我可以像这样重新加载一些不同的数据 grid trigger reloadGrid 但是 一旦我触发重新加载 我如何知道它何时完成加
  • 如何在 sqlite where 子句中使用编辑距离函数?

    我正在尝试实现 你是说吗 一种搜索功能 我正在尝试执行一个使用 levenshtein 函数的查询 该函数是用 ruby 编写的 我想知道如何在 sqlite3 查询中使用这个函数 我想这可能是这样的 results the db wher
  • PostgreSQL 日期差异

    我有一个计算日期差的 PostgreSQL 函数 CREATE OR REPLACE FUNCTION testDateDiff RETURNS int AS BODY DECLARE startDate TIMESTAMP DECLARE
  • 将外部资源文件夹添加到 Spring Boot

    我想添加一个相对于 jar 位置的资源文件夹 除了我的 jar 中的打包资源之外 例如 Directory Application jar resources test txt 我尝试过以下方法 Override public void a
  • ILogger 不尊重 Application Insights 的日志级别

    我一直在尝试使用 ASP NET Core 2 0 应用程序设置 Application Insights 在本地运行我的应用程序时 日志按预期显示在 Application Insights 中 但是 当部署到 Azure 应用服务时 虽
  • 使用 Prophet 时,“StanModel”对象没有属性“fit_class”

    我正在尝试使用先知 我已经安装了所有必需的软件包 pip install pandas numpy jupyterlab seaborn conda install pywin32 conda install c anaconda pyst
  • Delphi 2010 密码学库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 你能推荐一个开源的 Delphi 加密库吗 德尔福 2006 德尔福 2009 和德尔福 2010 算法需要 DES MD5 SHA 1 以下是我在
  • 我应该使用属性还是 getter 和 setter?

    我知道在 python 中使用 getter 和 setter 不是 pythonic 相反 应该使用属性装饰器 但我想知道以下场景 我有一个使用一些实例属性初始化的类 然后我需要向类添加其他实例属性 如果我不使用设置器 那么我必须写obj