想知道property()在python中的实际用法吗

2024-09-22 16:32:49 发布

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

我是新来的,正在试用python中的property()。我看到一个例子,并试图执行,但我收到一个错误。我尝试了以下代码:

class proper(object):
      def __init__(self):
          self.x = 4   
      def setx(self,val):
          self.x = val
      def getx(self):
          return self.x
      def delx(self):
          del self.x

      p = property(setx,getx,delx,'i am doc')

pr = proper()
pr.setx(7)
print pr.getx()

错误:

Traceback (most recent call last):
  File "./test3.py", line 148, in <module>
    pr.p=5
TypeError: getx() takes exactly 1 argument (2 given)

Tags: 代码selfobjectinitdef错误propertyval
3条回答

您误解了如何访问属性

改编自Python documentation for ^{}: 如果prproper的实例,pr.x将调用getxpr.x = setx将调用setter和del pr.xdeleter,delx

因此,您不应该将其称为pr.setx(7)

您得到的错误是因为您创建的p属性的参数顺序错误

尝试:

p = property(getx, setx, delx, 'i am doc') # getter before setter!

发生此错误的原因是在应调用setx时调用了getx。因为他们有不同数量的争论,这是破坏性的

请注意,设置属性的一种更优雅的方法是在定义访问器方法时使用decorator:

@property
def p(self):         # formerly getx
    'i am doc'
    return self.x

@p.setter
def p(self, value):  # formerly setx
    self.x = value

@p.deleter
def p(self):         # formerly delx
    del self.x

我不知道第148行是什么-但它没有提到你发布的代码

使用属性的关键在于,您可以定义使数据项看起来像属性的方法

使用发布的类定义,您现在可以执行以下操作:

pr = proper()
pr.x = 7 # No need to call pr.setx
print pr.x # no need to call pr.sety

这是一个非常基本和多余的属性使用

但是假设你把setx定义为:

def setx( self, val):
    if val < 0:
        raise ValueError("'x' cannot be negative")
     self.x = val

现在有了一个特殊的属性x,它永远不能为负。注意我还不能测试这个,因为我没有访问Python实现的权限

相关问题 更多 >