硬怼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
相似问题
尝试继承Local
回答 1
Flask的Context机制
回答 2