Python:@property decorator在初始化时无限循环?
Python版本是Python:@property decorator在初始化时无限循环?,python,Python,Python版本是3.6.5.。我正在学习如何为我的类Duck正确使用@decorator语法糖。但似乎我做错了什么,我的qq\u鸭死于过热。以下是演示: class Duck(object): def __init__(self, name): self.name = name @property def name(self): print("Quack! My name is", self.name) @name.sette
3.6.5.
。我正在学习如何为我的类Duck
正确使用@decorator
语法糖。但似乎我做错了什么,我的qq\u鸭死于过热。以下是演示:
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
qq\u duck=duck(“qq”)
我决定把我的名字改成QQ。
所以从现在起请叫我QQ!江湖郎中
我决定把我的名字改成QQ。
所以从现在起请叫我QQ!江湖郎中
我决定把我的名字改成QQ。
所以从现在起请叫我QQ!江湖郎中
...
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“”,第3行,在_init中__
文件“”,第13行,名称为
文件“”,第13行,名称为
文件“”,第13行,名称为
[上一行重复了488次]
文件“”,第11行,名称为
RecursionError:调用Python对象时超出了最大递归深度
请帮助…您的self.name所做的是调用刚刚定义的属性。但这就是它最初的名字,所以它会无限循环
此代码可以表示为:
self.name = "something" + ("something" + ("something" + ...[on to infinity!]...) )
当您分配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.\u name
与属性self.name
self.name=name
调用setter函数的方式不同。。。在setter函数中。通过将name
变量存储在self.\u name
而不是self.name