OOP中的python属性装饰器

时间:2018-01-27 01:58:17

标签: python decorator

我正在测试在OOP中使用@property的想法:

class Person(object):
    @property
    def name(self):
        return self.name

    @name.setter
    def name(self, newname):
        self.name = newname

james = Person()
james.name = 'James Bond'
print(james.name)
>>> RecursionError: maximum recursion depth exceeded

不知怎的,这给了我一个递归错误?

但如果我将self.name更改为self._name,则似乎可以解决问题。所以当我使用self.name作为name()时,我想我无法设置@property

2 个答案:

答案 0 :(得分:3)

错误的原因是您尝试返回的属性与property正在装饰的方法完全相同。因此,当您调用方法name时,调用会再次触发该方法,因为self.name是类中声明的方法。这会触发非终止递归。而是更改属性名称:

class Person(object):
   @property
   def name(self):
     return self._name

   @name.setter
   def name(self, newname):
      self._name = newname

答案 1 :(得分:0)

此外,如果你认为_符号很难看,你可以创建内部代理对象(例如python 3.3 +):

import types

class Person(object):
   def __init__(self):
       self.me = types.SimpleNamespace(name = "")

   @property
   def name(self):
     return self.me.name

   @name.setter
   def name(self, newname):
      self.me.name = newname