Python - @property 和 __init__() 中的设置有什么区别?

2023-11-21

无法从其他线程中得到关于此的直接答案:

在Python中,使用之间的主要区别是什么

class Foo(object):
  def __init__(self, x):
    self.x = x

and

class Foo(object):
  def __init__(self, x):
    self._x = x

  @property
  def x(self):
    return self._x

从外观上看,以这种方式使用 @property 会使 x 只读..但也许有人有更好的答案?谢谢/弗雷德


The property装饰器实现使用描述符协议,这就是我们在 Python OOP 中进行数据封装的方式。描述符是:

一般来说,描述符是一个具有“绑定”的对象属性 行为”,其属性访问已被方法覆盖 在描述符协议中。这些方法是__get__(), __set__(), and __delete__()。如果为对象定义了任何这些方法, 据说它是一个描述符。

通常,在其他 OOP 语言中,您使用 getter 和 setter。你会经常看到来自 Java 的人编写如下的 Python 类:

class A(object):
    def __init__(self, x, y):
        self._x = x
        self._y = y
    def getX(self):
        return self._x
    def getY(self):
        return self._y
    def setX(self, x):
        self._x = x
    def setY(self, y):
        self._y = y
    def some_method_that_uses_attributes(self):
        return self.getX() + self.getY()

这个非常多not你会如何用 Python 做事。 getter 和 setter 的目的是提供数据封装。我们通过将数据属性包装在 getter 和 setter 中来封装对数据属性的访问。然后,如果我们想添加一些东西,请确保x永远不会设置为低于 10 的值(作为一个人为的示例),我们只需更改方式setX已实现,我们无需修改其余代码。然而,在 Python 中,我们将上面的类编写如下:

class A(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def some_method_that_uses_attributes(self):
        return self.x + self.y

来自 Java 的人可能会惊恐地退缩:“你没有正确封装你的类!这将成为维护的噩梦!”

不,因为我们有描述符/属性:

class A(object):
    def __init__(self, x, y):
        self._x = x
        self.y = y
    @property
    def x(self):
        return self._x
    @x.setter
    def x(self, val):
        if val > 10:
            self._x = val
        else:
            raise ValueError("x must be greater than 10")
    def some_method_that_uses_attributes(self):
        return self.x + self.y

现在,我们不必折射使用的每个方法self.x, like some_method_that_uses_attributes。更重要的是,当我们进行此更改时,我们班级的客户端不会出现损坏的界面!这很好,因为它可以让我们避免编写一堆样板代码,并且在我们需要的情况下实现描述符相对简单do需要它。而且,这使得我们的代码变得漂亮又漂亮,而不需要self.get_this() and self.set_that(3)整个代码,并且更具可读性self.this and self.that = 3

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

Python - @property 和 __init__() 中的设置有什么区别? 的相关文章

  • python 中 matlibplot 中散点图的缩放轴

    我正在使用 matlibplot 进行数据可视化 我的绘图共有 6502 个数据值 运行良好 但值接近且密集 例如 我的 y 轴值范围在 3 到 10 之间 我需要清楚地获取它们之间的每个点 即像 9 2 和 9 8 这样的值至少要以 1
  • 安装 Pillow 和 PIL

    I have Ubuntu 12 04 http en wikipedia org wiki List of Ubuntu releases Ubuntu 12 04 LTS 28Precise Pangolin 29 Precise Pa
  • (Python) 我应该使用参数还是将其设为全局参数? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我有许多共享相同参数的函数 他们将多次输入和输出该参数 例如 a foo a fun a a bar a def fun a return a
  • 如何配置 VS Code 以便能够单步执行调试 Python 脚本时加载的共享库 (.so)?

    从命令行使用 gdb 我可以在加载共享库时中断 知道我有共享库的源代码 如何在 VS Code 中获得相同的行为 对我来说 它以某种方式起作用 这是我的设置 Ubuntu 18 04 调试我从 Python3 加载的 C 共享库 更具体地说
  • PyTorch 如何计算二阶雅可比行列式?

    我有一个正在计算向量的神经网络u 我想计算关于输入的一阶和二阶雅可比矩阵x 单个元素 有人知道如何在 PyTorch 中做到这一点吗 下面是我项目中的代码片段 import torch import torch nn as nn class
  • 如何使用Python从pdf文件中删除页面?

    我有一些超过 500 页的 pdf 文件 但每个文件中只需要几页 有必要保留文档的标题页 我确切地知道程序应该删除的页数 如何使用安装在 MS Visual Studio 上的 Python 2 7 环境来完成此操作 尝试使用PyPDF2
  • 如何在Python中绘制“Trace Explorer”?

    我需要重新创建一个情节 踪迹浏览器 https www bupar net trace explorer html与下面在 R 中创建的类似 我希望使用 matplotlib 但找不到任何有关如何执行这样的跟踪资源管理器的示例或参考 有人能
  • IP保持不变

    我正在尝试通过代码连接到 Tor 并更改我的身份 到目前为止我得到的结果是我连接成功但无法更改我的身份 这是我的代码 import socket import socks import httplib def connectTor sock
  • pythonic方式来反转一个字典,其中值是列表?

    我有一本看起来像这样的字典 letters by number 1 a b c d 2 b d 3 a c 4 a d 5 b c 我想将其反转为如下所示 numbers by letter a 1 3 4 b 1 2 5 c 1 3 5
  • 到底什么是序列?

    蟒蛇docs https docs python org 3 glossary html term sequence有点模棱两可 sequence 一个可迭代对象 支持通过以下方式使用整数索引进行有效的元素访问 getitem 特殊方法并定
  • 如何缩放图像的一部分并插入到 matplotlib 中的同一图中

    我想缩放数据 图像的一部分并将其绘制在同一个图中 看起来有点像这个图 是否可以在同一图中插入缩放图像的一部分 我认为可以用子图绘制另一个图形 但它绘制了两个不同的图形 我还阅读了添加补丁以插入矩形 圆形 但不确定将图像的一部分插入到图中是否
  • rpy2 传递 python 保留关键字参数

    我试图通过 python 使用 r 的密度函数 并且必须将 from to 参数传递给密度函数 然而 由于 from 这个词是Python中的保留关键字 我该如何实现这一点呢 谢谢 这是到目前为止的代码 r density robjects
  • 动态组装 Python 模块,动态导入

    我正在努力让自己熟悉importlib钩子 我想实现直接导入用其他语言编写的非Python文件并维护源映射的能力 因此提高SyntaxError带有行号的 s 仍然会给出有意义的堆栈跟踪 我加载外部文件的方法是组装 Pythonic 源代码
  • 访问具有动态名称的变量的值

    我发现了几个主题 其中讨论了在循环中动态创建单个变量是不好的做法 最好使用字典 就我而言 我不需要动态创建它们 我想要access他们在循环中 我不想用字典对于他们来说 因为这些变量在代码中的很多地方使用 并且只有一个地方我需要这种动态访问
  • 如何获取 Flask 中当前的基本 URI? [复制]

    这个问题在这里已经有答案了 在下面的代码中 我想将 URL 存储在变量中以检查发生 URL 错误的错误 app route flights methods GET def get flight flight data mongo db fl
  • 使用 Keras 时,验证集中未见的类别会出现错误

    我有由数值变量和分类变量组成的数据 分类变量有很多类别 因此我使用嵌入来表示这些类别 我的模型是一个简单的神经网络 我知道当你定义嵌入层时你需要通过input dim number of categories 1为了解释训练中看不见的类别
  • 将2个暗淡数组“列表列表”输出到python中的文本文件

    简单的问题 我正在创建一个两个暗淡的数组 ddist 0 d for in 0 d 在下面的代码中使用列表 它使用 gis 数据输出距离 我只是想要一种简单的方法来获取数组 列表的结果并将其输出到保持相同的 N N 结构的文本文件 我过去曾
  • python 格式日期时间,带有“st”、“nd”、“rd”、“th”(英文序数后缀),如 PHP 的“S”

    我想要一个 python datetime 对象来输出 并在 django 中使用结果 如下所示 Thu the 2nd at 4 30 但我在python中找不到输出的方法st nd rd or th就像我可以使用 PHP 日期时间格式一
  • python - 从完整地址获取邮政编码

    我有一个数据框 其中一列中有完整地址 我需要创建一个仅包含邮政编码的单独列 有些地址只有五位数字的邮政编码 而其他地址则有额外的四位数字 如何拆分列以获取邮政编码 示例数据 d name bob john address 123 6th S
  • 为文件中的每个单词创建字典并计算其后面的单词的频率

    我正在尝试解决一个难题 却迷失了方向 这就是我应该做的 INPUT file OUTPUT dictionary Return a dictionary whose keys are all the words in the file br

随机推荐