请注意:由于我的措辞不好,我已经对其中一些回复进行了编辑。怪我吧。谢谢大家容忍我。
我正在编写一个类,它具有类似int的属性。
它实现了__int__
方法。
我想实现所有int的神奇方法:__add__
、__and__
、__rshift__
等,通过对int(self)
应用相同的函数。
例如:
def __lshift__(self, other):
return int(self) << other
def __bool__(self):
return bool(int(self))
# and so forth, for about 40 more methods.
有没有什么东西可以帮我做到这一点?这似乎是一种常见的模式。
我尝试使用class MyClass(int)
,但这不允许我覆盖__int__
我的类 * 不是 * 一个int;我希望它能被当作一个int。
或者我应该用别的方法来做这件事?
我试图模拟FPGA线&寄存器-值将动态变化。
例如,如果将inst.wire2定义为inst.wire1 + 10
,则inst.wire2
将始终为inst.wire1 + 10
;如果inst.wire1改变,inst.wire2也随之改变。
一旦完成,几乎所有对给定线或寄存器的访问都将是针对其值,因此使每个引用inst.wire1.value
(或self.wire1.value
)将使代码非常混乱,没有任何好处。
澄清一下:如果有人将属性视为int(例如通过向它添加一个数字),结果应该是一个常规的,真实的,实际的int,没有魔法的东西。
2条答案
按热度按时间bihw5rsg1#
我使用的方法是将wire类拆分为几个相关的类:一个实现所有运算符的抽象超类,一个表示输入线的类,以及两个表示二元和一元运算符的类。
这是一个开始:
这种方法允许您构建可以使用不同输入多次评估的关联。
u4dcyp6a2#
好吧,我已经想出了一个答案(不一定是最好的,但它的工作)。
这个问题有两个部分。
其中一部分是如何根据需要计算值。这是使用
__get__
方法完成的。另一部分是创建一个从
__int__
继承的类(感谢@Augusto Vasques指出这一点!).在某种程度上,我的代码读起来像这样:
当然,这是一个巨大的简化;不包括register等,但符合问题的标准:
print(inst.mysecondwire + 10)
以防别人用这个,