2013-11-16 3 views
3

Я пытаюсь сделать простой код или оболочку Python, который позволит мне использовать его в качестве калькулятора ... для анализа схемы. В идеале я бы использовал обычный калькулятор Python для вычисления эквивалентных сопротивлений на основе обозначений: R1 + R2 означает два резистора последовательно, тогда как R1 // R2 означает два резистора параллельно. Будем надеяться, что это означает, что я могу использовать Python как обычно, такие как:Переопределение оператора деления пола

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

Так сопротивления серии будет достаточно просто (дух). Однако, когда дело доходит до резисторов параллельно, я хотел бы использовать пол-деления в качестве оператора, который позволил бы для обычных арифметических комбинаций:

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

Где // деление определяется как:

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

После выполнения некоторых исследований я понимаю, что встроенные классы, такие как целые и двойные, нельзя переопределить. Тем не менее, я действительно не хочу подкласса, потому что это потеряет легкость просто набирать значение сопротивления как примитивный тип. Есть ли другой способ, которым я мог бы это сделать? Я хотел бы, чтобы это было временным эффектом, который существует только в небольшой области и может быть выполнен в начале файла оболочки. Благодаря!

+0

Сопротивление не является примитивным типом, поэтому вы не сможете просто ввести его, если только вам не удастся выполнить «monkey-patch» int. Я думаю, что делать «R (1) + R (2)» и «R (1) | R (2) 'проще и понятнее. – Blender

ответ

3

Лучше идти с подклассами. С int/doubles вы не сможете использовать другие элементы рядом с резисторами. Вы можете создавать классы с очень коротким названием, как «R» или резисторы, «C» для конденсаторов и т.д. Это не будет иметь много накладных расходов и будет более удобным для чтения

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

Вы можете создать объект, который будет делать он более или менее похож на то, что вы можете использовать целочисленные литералы с другим смыслом.

Например, если определить операторы на право p объекта, вы можете использовать синтаксис, как это:

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

В качестве альтернативы, вы можете сделать что-то вроде этого:

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

или даже:

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

Возможно, я использовал бы этот тип оператора магия "в проекте, который я выполняю самостоятельно, или если он значительно улучшает читаемость.

Смежные вопросы