我正在测试在OOP中使用@property
的想法:
class Person(object):
@property
def name(self):
return self.name
@name.setter
def name(self, newname):
self.name = newname
james = Person()
james.name = 'James Bond'
print(james.name)
>>> RecursionError: maximum recursion depth exceeded
不知怎的,这给了我一个递归错误?
但如果我将self.name
更改为self._name
,则似乎可以解决问题。所以当我使用self.name
作为name()
时,我想我无法设置@property
?
答案 0 :(得分:3)
错误的原因是您尝试返回的属性与property
正在装饰的方法完全相同。因此,当您调用方法name
时,调用会再次触发该方法,因为self.name
是类中声明的方法。这会触发非终止递归。而是更改属性名称:
class Person(object):
@property
def name(self):
return self._name
@name.setter
def name(self, newname):
self._name = newname
答案 1 :(得分:0)
此外,如果你认为_符号很难看,你可以创建内部代理对象(例如python 3.3 +):
import types
class Person(object):
def __init__(self):
self.me = types.SimpleNamespace(name = "")
@property
def name(self):
return self.me.name
@name.setter
def name(self, newname):
self.me.name = newname