python - 使用 property() 和 @property 定义的属性

标签 python oop

我现在正在尝试正确学习Python,并且我对创建对象属性的两种方法的存在感到非常困惑:使用 @property装饰器和 property()方法。因此以下两条都是有效的:

class MyClassAt:
    def __init__(self, value):
        self._time = value

    @property
    def time(self):
        return self._time

    @time.setter
    def time(self, value):
        if value > 0:
            self._time = value
        else:
            raise ValueError('Time should be positive')

class MyClassNoAt:
    def __init__(self, value):
        self._time = value

    def get_time(self):
        return self._time

    def set_time(self, value):
        if value > 0:
            self._time = value
        else:
            raise ValueError('Time should be positive')

    time = property(fget=get_time, fset=set_time)

有使用哪一个协议(protocol)吗? Pythonista 会选择什么?

最佳答案

它们是等效的,但首选第一个,因为许多人发现它更具可读性(同时也不会使代码和命名空间困惑)。 第二种方法的问题是您定义了两个永远不会使用的方法,并且它们保留在类中。

只有当必须支持非常旧的 Python 版本(不支持装饰器语法糖)时,才会使用第二种方法。 Python 2.4 中添加了函数和方法装饰器(而类装饰器仅在版本 2.6 中添加),因此在几乎所有情况下这都是过去的问题。

关于python - 使用 property() 和 @property 定义的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40004026/

相关文章:

python - 在字符串替换中多次引用相同的输入?

python - 其中 col 等于值复制到单独的列 - Pandas

python - Microsoft Azure 应用程序网关阻止 python 的请求库

c++ - 有效地在 C++ 类之间传输数据

c# - 如何收集对象列表中的单个属性?

php - Magento 继承链。好的还是坏的做法?

python - include_package_data=True 无效

python - 对齐没有公共(public)索引的 pandas DataFrame

php - 既然可以在声明时设置变量,为什么还要在 PHP 类的结构中设置变量呢?

c++ - C++ 中的 vector 和多态性