【问题标题】:Python Attrs Trigger Converter while set attributePython Attrs 在设置属性时触发转换器
【发布时间】:2026-01-10 23:00:02
【问题描述】:

在使用python-attrs时,设置属性时触发转换器的好方法是什么。

前:

@attr.s
class A(object):
   b = attr.ib(converter=str)

>>> A(b=1)
A(b='1')
>>> a = A(b=1)
>>> a.b
'1'
>>> a.b = 2
>>> a.b
2   # converter not used

【问题讨论】:

    标签: python validation python-attrs


    【解决方案1】:

    在您的情况下,您无法通过 reference of philosophy 使用 attrs 来做到这一点: attrs 运行时影响非常接近于零,因为所有工作都是在定义类时完成的。一旦你初始化它, attrs 就完全不存在了。

    查看 attrs real 的作用:

    import attr
    import inspect
    
    
    @attr.s
    class A(object):
        b = attr.ib(converter=str)
    
    
    print(inspect.getsource(A.__init__))
    

    输出是

    def __init__(self, b):
        self.b = __attr_converter_b(b)
    

    所以你可以看到所有的魔法都是在init函数中完成的,所以在实例初始化之后,attrs不能再处理了,如果你真的想控制自己的设置行为,为什么不使用描述符,也就是专为类属性而设计。

    【讨论】:

    • 谢谢,但是有一个 attr.validate(obj)。我看不出我们没有类似 attr.conv(obj) 或 attr.validate(obj, convert=True) 的原因