【发布时间】:2021-11-25 08:07:10
【问题描述】:
我想创建一个具有以下行为的Block 类:如果设置了 iip3,则 oip3 设置为 iip3 + 增益。如果设置了 oip3,则将 iip3 设置为 oip3 - 增益如下:
b = Block(gain = 10)
Block(gain=10, iip3=inf, oip3=inf)
b.oip3 = 30
Block(gain=10, iip3=20, oip3=30)
b.iip3 = 21
Block(gain=10, iip3=21, oip3=31)
我已经用 attrs 模块尝试过这个:
import attr
import numpy as np
def set_oip3(instance, attribute, iip3):
instance.oip3 = iip3 + instance.gain
return iip3
def set_iip3(instance, attribute, oip3):
instance.iip3 = oip3 - instance.gain
return oip3
@attr.s
class Block:
gain = attr.ib()
iip3 = attr.ib(on_setattr=set_oip3, default=np.inf)
oip3 = attr.ib(on_setattr=set_iip3, default=np.inf)
但是,这不起作用。我怀疑对set_oip3 的调用会导致调用set iip3,然后调用set oip3。
必须有使用 attrs 的解决方案。
【问题讨论】:
-
您是否有任何理由专门寻找使用
attrs的解决方案? -
如果在运行期间调整增益,所有值都会重置吗?您使用的那些值是实例属性,还是类属性?
-
之所以使用
attrs,是因为它减少了很多样板代码。但是,鉴于以下解决方案,我可能会重新考虑。 -
至于如果增益发生变化会发生什么,这是一个很好的问题,我需要选择一种有意义的行为。如果增益发生变化,则 oip3 可能会保持固定,并且 iip3 会重新计算。
-
如果任一答案令人满意,请继续接受一个。如果没有,请更新您的要求!
标签: python python-attrs