Python 在许多类属性上使用属性

Python 在许多类属性上使用属性,python,oop,python-decorators,Python,Oop,Python Decorators,我有两个类,它们有很多属性,除了一个之外,所有的类都应该有相似的属性函数。我倾向于避免为所有属性手动编写这些属性,因为这将非常繁琐,并且会迫使我对添加到类中的每个属性进行跟踪。而且,我需要为不止一节课做这件事 我将在生成我的_容器中的对象后使用它。 下面是我想解决的一个简单例子 def my_class: @property def a1(self): return self.my_container._a1 ... @property

我有两个类,它们有很多属性,除了一个之外,所有的类都应该有相似的属性函数。我倾向于避免为所有属性手动编写这些属性,因为这将非常繁琐,并且会迫使我对添加到类中的每个属性进行跟踪。而且,我需要为不止一节课做这件事

我将在生成我的_容器中的对象后使用它。 下面是我想解决的一个简单例子

def my_class:            

  @property
  def a1(self):
    return self.my_container._a1
    ...
  @property
  def a10(self):
    return self.my_container._a10

对于遵循特定模式的一系列属性,我将使用
\uu getattr\uu
钩子:

def __getattr__(self, name):
    # translate a\d names into _a\d
    if name.startswith('a') and name[1:].isdigit():
        return getattr(self, '_' + name)

这假定直接设置这些属性并不容易(因此添加
a0
而不是
\u a0
),例如,当您还有一个相应的
\u setattr\u
来处理设置这些相同属性时的选通或转换时。

它们必须是属性吗?您可以只实现一个
\uuu getattr\uuu
函数
def\uuu getattr\uuuu(self,name):返回getattr(self,'.'+name)
。我还需要实现setattr,我更喜欢在这个代码@martijnpieters上避免使用神奇的方法。然后,你的另一个选择是使用类装饰器或元类来生成所有这些属性对象。现在我决定使用
\uu getattr\uuuuuu
。这确实让我的代码有点乏味。重写函数是否有缺点?谢谢@MartijnPietersNo,只要您不尝试访问在
\uuuuu getattr\uuuu
中不再存在的属性,并且不限制您在
\uuu getattr\uuuu
中响应的名称,您就不会导致无限递归,那么
\uu getattr\uuuu
就是正确的解决方案。