有没有办法将相同的属性逻辑应用于类中的一组属性?例如,我想将相同的 @attr1.setter
装饰器应用于 attr2
、attr3
和 attr4
而无需必须为每个属性定义属性。
class Sample:
def __init__(self):
self.attr1 = None
self.attr2 = None
self.attr3 = None
self.attr4 = None
@property
def attr1(self):
return self.__attr1
@attr1.setter
def attr1(self, val):
if val < 0:
self.__attr1 = 0
else:
self.__attr1 = val
最佳答案
只需为此创建您自己的描述符:
class MyDescriptor:
def __set_name__(self, owner, name):
self.name = f'_{name}'
def __get__(self, instance, owner):
return getattr(instance, self.name)
def __set__(self, instance, val):
if val is None:
setattr(instance, self.name, None)
elif val < 0:
setattr(instance, self.name, 0)
else:
setattr(instance, self.name, val)
class Sample:
attr1 = MyDescriptor()
attr2 = MyDescriptor()
attr3 = MyDescriptor()
attr4 = MyDescriptor()
def __init__(self):
self.attr1 = None
self.attr2 = None
self.attr3 = None
self.attr4 = None
现在,在行动:
In [3]: s = Sample()
In [4]: s.attr1 = -99
In [5]: s.attr1
Out[5]: 0
In [6]: s.attr2
In [7]: s.attr2 = 10
In [8]: s.attr2
Out[8]: 10
In [9]: s.attr2 = -1
In [10]: s.attr2
Out[10]: 0
参见 Descriptor HOWTO和一些更相关的documentation
请注意,我合并了 None
的可能性在您的 setter 逻辑中(您的代码会在实例初始化时引发 TypeError
,因为 setter 检查是否 None < 0
)。另请注意,您可能不想使用双下划线名称修饰(这并不意味着私有(private)),所以我使用常规单下划线来表示一个不属于公共(public) api 的变量。使用双下划线名称修改会使这里的事情复杂化。
关于Python - 可以将相同的属性逻辑应用于多个属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54952855/