Python - 可以将相同的属性逻辑应用于多个属性吗?

标签 python python-3.x properties decorator

有没有办法将相同的属性逻辑应用于类中的一组属性?例如,我想将相同的 @attr1.setter 装饰器应用于 attr2attr3attr4 而无需必须为每个属性定义属性。

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/

相关文章:

c# - 如何实现 DateTime 实体属性以始终设置 DateTime.Now

spring - 在 Groovy 中使用 @Value Spring 注解

python - 为什么 numba 和 numpy 在就地操作上表现不同?

python-3.x - 属性错误 : module 'tensorflow' has no attribute 'Graph'

python - 访问 python 元组中的特定条目

python - 过滤掉 'N' 后跟任意数字组合的正则表达式

python - 如何使用python获取同一列中相同值之间的时间差

c# - 在 C# 中使用委托(delegate)作为属性是否正确?

字符串连接中的 Python 内联条件

python - 如何使Open CV在已部署的Web应用程序上工作