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
Run Code Online (Sandbox Code Playgroud)
终端:
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
Run Code Online (Sandbox Code Playgroud)
请帮忙...
当您分配时,setter 函数会调用自身self.name = name。这确实会导致无限递归。
修复可能是这样的:
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
Run Code Online (Sandbox Code Playgroud)
请注意成员self._name与属性的不同之处self.name。