【问题标题】:Python: modifying property valuePython:修改属性值
【发布时间】:2016-07-01 23:04:52
【问题描述】:

我有以下使用两个简单属性的代码:

class Text(object):

    @property
    def color(self):
        return 'blue'

    @property
    def length(self):
        return 22

t = Text()
print t.color

当我运行它时,它显然返回blue。但是如何在代码的后面动态更新颜色的值呢? IE。当我尝试这样做时:

t = Text()
print t.color
t.color = 'red'
print t.color

失败并出现can't set attribute 错误。有没有办法修改属性的值?

编辑:

如果将上面的代码重写为像 williamtroup 的回答中那样使用 setter,那么简单地将其缩短为:

class Text(object):

    def __init__(self):
        self.color = self.add_color()
        self.length = self.add_length()

    def add_color(self):
        return 'blue'

    def add_length(self):
        return 22

【问题讨论】:

  • 回答您的编辑;不是 Pythonic 和坏习惯。
  • @EddB 怎么不是 Pythonic?
  • 不管怎样,问题都得到了回答。由您决定哪种方法是实现您的课程的最佳方式。
  • 阅读this

标签: python class properties


【解决方案1】:

您需要一个属性设置器和一个类变量来存储数据。

用你的例子:

class Text(object):

    def __init__(self):
        self._color = "blue"
        self._length = 12

    @property
    def color(self):
        return self._color

    @color.setter
    def color(self, value):
        self._color = value

    @property
    def length(self):
        return self._length

    @length.setter
    def length(self, value):
        self._length = value

【讨论】:

  • 如果使用setter重写,与简单使用属性相比有什么优势?请参阅我对问题的编辑。
  • 参考这个问题:stackoverflow.com/questions/7374748/…。这应该告诉你你需要的一切。
  • 是的,我理解其中的区别,但你为什么要使用一个而不是另一个呢?此外,如果我想要基于某种逻辑计算出的默认值,我将需要三个函数:两个属性,getter 和 setter,以及另外一个函数来使用基于该逻辑的值填充 self._color。使用属性时,这是三个功能而不是一个功能。
  • setter 是用来填充self._color 的函数。
  • 尽管 __init__() 在技术上是一个函数,但它实际上是类的构造函数。无论哪种方式都可以,我更喜欢“setter”方法,因为它允许我练习良好的封装规则(是的,即使在 python 中也是如此)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-30
  • 2018-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-30
  • 1970-01-01
相关资源
最近更新 更多