Python - 我应该在没有init或setter的情况下使用只读@property吗?

时间:2014-02-27 15:50:22

标签: python class properties

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

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函数中反映的显示方法,从不设置变量值的函数。但是,从阅读文档我的理解是@setter需要一个参数,在这种情况下我没有。在计算@property getter方法中的class属性的只读值时是否存在问题,而不是简单地传递已存在的属性?

1 个答案:

答案 0 :(得分:2)

没有问题。 @property只是比你想象的要少。所有这些都取代了一些语法糖:a = foo.x a = foo.x.getter()foo.x = bar foo.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

区域是矩形的属性,但它是从宽度和高度得出的,并且设置它实际上没有任何意义。