Python:初始化时@property装饰器无限循环?

s̮̦*_*̥̳̼ 3 python

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)

请帮忙...

hir*_*ist 5

当您分配时,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