九州编程
只需为此创建您自己的描述符: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 = -99In [5]: s.attr1Out[5]: 0In [6]: s.attr2In [7]: s.attr2 = 10In [8]: s.attr2Out[8]: 10In [9]: s.attr2 = -1In [10]: s.attr2Out[10]: 0请参阅描述符 HOWTO和一些更相关的文档请注意,我None在您的 setter 逻辑中加入了可能性(您的代码会TypeError在实例初始化时引发 a ,因为 setter 检查 if None < 0)。另请注意,您可能不想使用双下划线名称修饰(这并不意味着 private),因此我使用传统的单下划线来表示不属于公共 api 的变量。使用双下划线名称修改会使这里的事情复杂化。