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
就是正确的解决方案。