Как мне добавить свойства в класс с помощью декоратора, который принимает список имен в качестве аргумента?

Я хотел бы добавить много dummy-properties в класс через декоратор, например:

def addAttrs(attr_names):
  def deco(cls):
    for attr_name in attr_names:
      def getAttr(self):
        return getattr(self, "_" + attr_name)
      def setAttr(self, value):
        setattr(self, "_" + attr_name, value)
      prop = property(getAttr, setAttr)
      setattr(cls, attr_name, prop)
      setattr(cls, "_" + attr_name, None) # Default value for that attribute
    return cls
  return deco

@addAttrs(['x', 'y'])
class MyClass(object):
  pass

К сожалению, декоратор, похоже, сохраняет ссылку на attr_name вместо своего содержимого. Следовательно, MyClass.x и MyClass.y обращаются к обоим MyClass._y :

a = MyClass()
a.x = 5
print a._x, a._y
>>> None, 5
a.y = 8
print a._x, a._y
>>> None, 8

Что мне нужно изменить, чтобы добиться ожидаемого поведения?

6
задан Philipp der Rautenberg 3 February 2012 в 08:40
поделиться