Python:@property decorator在初始化时无限循环?

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

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.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