Python应该使用没有init或setter的readonly@property吗?

2024-09-29 00:20:32 发布

您现在位置:Python中文网/ 问答频道 /正文

试着让我了解一下房地产装潢师。我找到了一个用于设置只读属性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方法中计算类属性的只读值与简单地传递已经存在的属性有什么问题吗?在


Tags: 方法函数nameself属性objectfooinit
1条回答
网友
1楼 · 发布于 2024-09-29 00:20:32

没有问题。@property只是做的比你想象的要少。用a = foo.x替换a = foo.x,用foo.x.setter(bar)替换{}。也就是说,它允许您用方法调用替换属性访问。这些方法可以做任何他们喜欢的事情,这就是属性的目的。我想你被第一个例子误导了,在这个例子中,属性只是传递给一个底层的隐藏变量,使psuedo成为只读变量。这并不是真正的标准用例。一个非常常见的例子可能是:

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

面积是矩形的属性,但它是从宽度和高度派生出来的,设置它没有任何意义。在

相关问题 更多 >