我是新手,并在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)
答案 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
:
如果pr
是proper
的实例,pr.x
将调用getx
,pr.x = setx
将调用setter并del pr.x
删除者{{1} 1}}。
因此,您不应将其称为delx
。