覆盖地板分部操作员

时间:2013-11-16 09:07:37

标签: python operators override

我正在尝试制作一个简单的Python代码或shell,它允许我将其用作计算器......用于电路分析。理想情况下,我会使用Python的常规计算器来计算基于符号的等效电阻:R1 + R2表示串联的两个电阻,而R1 // R2表示并联的两个电阻。希望这意味着我可以像往常一样使用Python,例如:

>>> 1 + 1
2
>>> R1 = 1
>>> R2 = 2
>>> R1 + R2
3

因此,串联电阻足够简单(duh)。但是,当涉及并联电阻时,我想使用floor-division作为运算符,这将允许正常的算术组合:

>>> 2 // 2
1
>>> (R2 // 2) + R1
2

//除法定义为:

def __floordiv__(self, other):
    return 1/(1/self.value + 1/other)

在做了一些研究之后,我明白不能覆盖整数和双精度等内置类。但是,我真的不想继承子类,因为这样就不会简单地将电阻值键入为原始类型。还有其他方法我可以做到这一点吗?我希望这是一个临时效果,只存在于一个小范围内,可以在shell文件的开头执行。谢谢!

2 个答案:

答案 0 :(得分:3)

最好使用子类。使用int / double,您将无法使用电阻旁边的其他元素。您可以创建具有非常短名称的类,如“R”或电阻器,“C”用于电容器等。这将不会产生大量开销并且更具可读性

R(2) +  R(2) == R(4)
R(2) // R(2) == R(2)

答案 1 :(得分:0)

您可以创建一个对象,使其看起来或多或少像您可以使用具有不同含义的整数文字。

例如,如果您正确定义p对象的运算符,则可以使用如下语法:

2 + (p/ 3 // 2 // 10) + 4

或者,您可以这样做:

2 + (3 /_/ 2 /_/ 10) + 4

甚至:

2 + (3 /_/ 2 // 10) + 4

我可能只会在我自己做的项目中使用这种“操作员魔法”,或者它极大地提高了可读性。