硬怼Flask的小白关于Setter的看法(这里容易出现递归错误,提醒用)
来源:9-8 Python属性描述符实现getter与setter
qq_AnAvenue_0
2019-03-10
property装饰器是获取某个属性:当我们代码是var=b实例.name属性 (读)的时候,我们是调用property修饰的方法。
setter装饰器需要配合property装饰器,是对实例的某个属性进行赋值的,所以setter装饰器需要和property修饰的方法保持一致(修饰的函数不需要保持一致,但不保持一致会warning)。self.name = name或b.name = 'str'(写)就是调用的setter方法。
#递归超过上限代码
class B:
def __init__(self, name):
self.name = name#这里跳到setter方法。因为self.name=name是调用setter
@property
def name(self):
return self.name
@name.setter
def name(self, name):
if not isinstance(name, str):
raise TypeError('Not String')
self.name = name#一直在这里报递归。
b = B('qwe')#正确代码
class C:
def __init__(self, name):
self.name = name
@property
def score(self):
return self._score
@score.setter
def score(self, score):
if not isinstance(score, int):
raise TypeError('Not Int')
self._score = score
c = C('asd')
c.score = 99
print(c.score)写回答
1回答
-
我不太清楚什么意思?看了下代码,第一段代码确实是一个无线递归循环啊,因为在setter里又调用了自身啊。
022019-03-11
相似问题