Discuss / Python / @property

@property

Topic source

Ethann

#1 Created at ... [Delete] [Delete and Lock User]

记录一个挫败经历~

原始代码如下:

class Screen(object):
    @property
    def width(self):
        return self._width
    @width.setter
    def width_setter(self, value):
        if not isinstance(value, int):
            raise ValueError("Screen's width must be an integer.")
        self._width = value
    @property
    def heigh(self):
        return self._heigh
    @heigh.setter
    def heigh_setter(self, value):
        if not isinstance(value, int):
            raise ValueError("Screen's width must be an integer.")
        self._heigh = value
    @property
    def resolution(self):
        return self._width * self._heigh
    
sc = Screen()
sc.width = 1080
Traceback (most recent call last):
  File "C:\Users\asj\AppData\Local\Programs\Python\Python310\lib\code.py", line 90, in runcode
    exec(code, self.locals)
  File "<input>", line 1, in <module>
AttributeError: can't set attribute 'width'

仔细检查后更改的代码如下:

class Screen(object):
    @property
    def width(self):
        return self._width
    @width.setter
    def width(self, value1):
        if not isinstance(value1, int):
            raise ValueError("Screen's width must be an integer.")
        self._width = value1
    @property
    def heigh(self):
        return self._heigh
    @heigh.setter
    def heigh(self, value2):
        if not isinstance(value2, int):
            raise ValueError("Screen's width must be an integer.")
        self._heigh = value2
    @property
    def resolution(self):
        return self._width * self._heigh

下面的代码能用,为什么上面的不行呢?原因在于我在@width.setter@heigh.setter后面的方法是:def width_setter (self,value)def heigh_setter (self, value),方法名和.setter之前的不同,导致了AttributeError: can't set attribute 'width'。特此记录一下~


  • 1

Reply