Python - 我应该使用只读 @property 而不使用 init 或 setter 吗?

标签 python class properties

尝试了解特性装饰者。我找到了一个用于设置只读属性的解决方案 here 。如果您可以在 init 中指定该属性,则设置私有(private)属性然后提供 @property getter 方法是有意义的。但是如果您想使用函数来计算只读属性呢?假设您有一个类从另一个类调用属性(例如状态),然后计算一个新值,该值将作为属性提供:

class MyState(object):
    def __init__(self, starting_value):
        self._foo = starting_value

    @property
    def foo(self):
        return self._foo

    @foo.setter
    def foo(self, value):
        self._foo = value


class MyClass(object):
    def __init__(self, name=None):
        self.name = name

    @property
    def bar(self):
        state = MyState.foo
        return id(state)

>mystate = MyState('chuff')
>myclass = MyClass()
>myclass.bar = 183097448L

在我所看到的有关属性装饰器的所有内容中,我只看到了 @property getter 函数中反射(reflect)的显示方法,从未看到设置变量值的函数。然而,通过阅读文档,我的理解是 @setter 需要一个参数,而在本例中我没有。与简单地传递已存在的属性相比,在 @property getter 方法中计算类属性的只读值是否存在任何问题?

最佳答案

没问题。 @property只是做的比你想象的要少。它只是一些需要替换的语法糖:a = foo.xa = foo.x.getter() ,和foo.x = barfoo.x.setter(bar) 。也就是说,它允许您用方法调用替换属性访问。这些方法可以做任何他们喜欢做的事情,这就是该属性的目的。我认为您被第一个示例引入了歧途,其中属性只是传递到底层隐藏变量以创建伪只读变量。这并不是真正的标准用例。一个非常常见的例子可能是:

class Rectangle(object):
    def __init__(self, w, h):
        self.w = w
        self.h = h
    @property
    def area(self):
        return self.w * self.h

面积是矩形的一个属性,但它是从宽度和高度导出的,设置它并没有任何意义。

关于Python - 我应该使用只读 @property 而不使用 init 或 setter 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22073515/

相关文章:

c# - 如何在 sqlite join 从 windows store c#/xaml 应用程序中的多个表返回数据时设置属性类

python - 对 pandas 面板数据进行上采样

python - S3对象返回八位字节流,但以png格式上传

c++ - 创建类的二维数组

C++,在尝试创建类 : error: no ‘void media::*()’ member function declared in class ‘media’ 时收到此消息

java - 在 java 项目中将方法(非 get 和 set)放在哪里才能符合 Spring MVC

javascript - Array.prototype.sort 方法更改数组值以及该数组的变量值

python - 梯度下降算法需要很长时间才能完成 - 效率 - Python

java - 在 wicket 有没有办法直接读取本地化属性?

c# - C# 中的非整数索引索引器属性