property() 控制的方法,值到底是赋值语句的值还是 fget或者fset的返回值?

测试property(),
如下为什么 print(n.y)结果还是10?
setname 和 getname的return 有什么区别?
n.y的结果,到底是 10? 类外面执行的赋值语句?
还是500? setname 返回的值, 还是50? getname返回的值?

 class A:
    def __init__(self):
        self.__x = 100
        self.y = property(fget=self.getname,fset=self.setname)

    def setname(self,value):
        self.__z = value
        print('set attribute')
        return 600

    def getname(self):
        print('get attribute')
        return 50

    def test(self):
        print(self.x)

    x = property(getname,setname)

n = A()
#n.y = 10
n.x = 10
print(n.x)
n.test()

print ('###')
n.y = 10
print(n.y)
n.test()
最佳答案

property的赋值语句,也就是setter方法是没有返回值这一说的,他本身的作用就是赋值。

  • 经典写法

    class C:
      def __init__(self):
          self._x = None
    
      def getx(self):
          return self._x
    
      def setx(self, value):
          self._x = value
    
      def delx(self):
          del self._x
    
      x = property(getx, setx, delx, "I'm the 'x' property.")
  • 现在最广泛好理解的写法

    class C:
      def __init__(self):
          self._x = None
    
      @property
      def x(self):
          """I'm the 'x' property."""
          return self._x
    
      @x.setter
      def x(self, value):
          self._x = value
    
      @x.deleter
      def x(self):
          del self._x

你用第二种写法可以自己再理解一下。

2年前 评论
讨论数量: 1

property的赋值语句,也就是setter方法是没有返回值这一说的,他本身的作用就是赋值。

  • 经典写法

    class C:
      def __init__(self):
          self._x = None
    
      def getx(self):
          return self._x
    
      def setx(self, value):
          self._x = value
    
      def delx(self):
          del self._x
    
      x = property(getx, setx, delx, "I'm the 'x' property.")
  • 现在最广泛好理解的写法

    class C:
      def __init__(self):
          self._x = None
    
      @property
      def x(self):
          """I'm the 'x' property."""
          return self._x
    
      @x.setter
      def x(self, value):
          self._x = value
    
      @x.deleter
      def x(self):
          del self._x

你用第二种写法可以自己再理解一下。

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!