Python版本是3.6.5.。我正在学习如何正确地为我的@decorator使用class Duck语法糖。但似乎我做错了什么,我的qq_duck死于过热。下面是演示:
class Duck(object):
def __init__(self, name):
self.name = name
@property
def name(self):
print("Quack! My name is", self.name)
@name.setter
def name(self, name):
print("I've decided to change my name into", name, ".")
print("So please call me", name, "from now on! Quack!")
self.name = name航站楼:
qq_duck = Duck("QQ")
I've decided to change my name into QQ .
So please call me QQ from now on! Quack!
I've decided to change my name into QQ .
So please call me QQ from now on! Quack!
I've decided to change my name into QQ .
So please call me QQ from now on! Quack!
...
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<input>", line 3, in __init__
File "<input>", line 13, in name
File "<input>", line 13, in name
File "<input>", line 13, in name
[Previous line repeated 488 more times]
File "<input>", line 11, in name
RecursionError: maximum recursion depth exceeded while calling a Python object请帮帮我..。
发布于 2018-04-23 13:19:36
当您分配self.name = name时,setter函数会调用它自己。这确实会导致无限递归。
解决办法可能是:
class Duck(object):
def __init__(self, name):
self._name = name
@property
def name(self):
print("Quack! My name is", self._name)
# here you usually return the data member...
return self._name
@name.setter
def name(self, name):
print("I've decided to change my name into", name, ".")
print("So please call me", name, "from now on! Quack!")
self._name = name注意成员self._name与属性self.name是如何不同的。
发布于 2018-04-23 13:19:23
您的self.name所做的是调用您刚刚定义的属性。但这是它最初所称的,所以它将无限循环。
该代码可表示为:
self.name = "something" + ("something" + ("something" + ...[on to infinity!]...) )https://stackoverflow.com/questions/49982126
复制相似问题