首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:@属性装饰器无限循环初始化时?

问Python:@属性装饰器无限循环初始化时?
EN

Stack Overflow用户
提问于 2018-04-23 13:17:19
回答 2查看 864关注 0票数 3

Python版本是3.6.5.。我正在学习如何正确地为我的@decorator使用class Duck语法糖。但似乎我做错了什么,我的qq_duck死于过热。下面是演示:

代码语言:javascript
复制
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

航站楼:

代码语言:javascript
复制
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

请帮帮我..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-23 13:19:36

当您分配self.name = name时,setter函数会调用它自己。这确实会导致无限递归。

解决办法可能是:

代码语言:javascript
复制
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是如何不同的。

票数 5
EN

Stack Overflow用户

发布于 2018-04-23 13:19:23

您的self.name所做的是调用您刚刚定义的属性。但这是它最初所称的,所以它将无限循环。

该代码可表示为:

代码语言:javascript
复制
self.name = "something" + ("something" + ("something" + ...[on to infinity!]...) )
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49982126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档