想知道在python中真正使用property()

时间:2014-04-19 16:43:32

标签: 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)

3 个答案:

答案 0 :(得分:1)

我不知道第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实现。

答案 1 :(得分:1)

您获得的错误是因为您创建了p属性,其参数的顺序错误。

尝试:

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

错误发生的原因是getx应该在调用时setx被调用。因为他们采用不同数量的论点,这就破坏了事情。

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

@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

答案 2 :(得分:0)

您误解了如何访问属性。

改编自Python documentation for property: 如果prproper的实例,pr.x将调用getxpr.x = setx将调用setter并del pr.x删除者{{1} 1}}。

因此,您不应将其称为delx