硬怼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回答

7七月

2019-03-10

我不太清楚什么意思?看了下代码,第一段代码确实是一个无线递归循环啊,因为在setter里又调用了自身啊。

0
2
7七月
回复
qq_AnAvenue_0
我非常欣赏你这种学习方式,就是直接跟着高级走,不懂的再返回来学习,这种学习方式虽然要求高,但是最有效的。
2019-03-11
共2条回复

Python Flask高级编程之从0到1开发《鱼书》精品项目

7月老师深入浅出剖析Flask核心机制,和你一起探讨Python高级编程

2736 学习 · 1267 问题

查看课程