在Python中用我的类的实例划分数字

时间:2017-07-07 12:23:57

标签: python math division

我有一个名为Time的类,我需要实现一个Frequency类。如何通过int的实例实现floatTime分割以获取Frequency的实例?

我已经了解__div____truediv____floordiv__和其他Python特殊方法,我已经在我的代码中使用它们来按类别或其他类的实例划分类的实例,但我找不到用我的班级实例来划分数字的方法。

是否可以通过Python中的类实例来划分数字?

3 个答案:

答案 0 :(得分:27)

您正在寻找__rtruediv__方法。 执行x / y时,如果type(x)没有实现__div__(self, other)方法,其中other可以是类type(y),则会执行type(y).__rtruediv__(y, x),并返回其结果。

用法:

class Foo:
    def __init__(self, x):
        self.x = x

    def __truediv__(self, other):
        return self.x / other

    def __rtruediv__(self, other):
        return other / self.x
>>> f = Foo(10)    
>>> f / 10
1.0
>>> 10 / f
1.0

答案 1 :(得分:9)

是。您只需确保Time.__rtruediv__()在收到浮点数或整数时返回Frequency实例。

用法:

>>> 100 / Time(2)
Frequency(50.0)
>>> 2.5 / Time(5)
Frequency(0.5)

实施:

class Time:
  def __init__(self, value):
    self.value = value

  def __rtruediv__(self, other):
    if not isinstance(other, (int, float)):
      return NotImplemented
    return Frequency(other / self.value)

class Frequency:
  def __init__(self, value):
    self.value = value

  def __repr__(self):
    return '{}({})'.format(self.__class__.__name__, self.value)

python docs包含implementing the arithmetic operations的完整示例,用于自定义类。

处理不兼容类型的正确方法是返回特殊值NotImplemented

  

NotImplemented

     

二进制应返回的特殊值   特殊方法(例如__eq__()__lt__()__add__()__rsub__()等)   表明该操作未实施   其他类型

假设您尝试使用不受支持的复数,返回NotImplemented最终会导致TypeError出现正确的错误消息。 (至少在python 3中)

>>> 100j / Time(2)

Traceback (most recent call last):
  File "python", line 1, in <module>
TypeError: unsupported operand type(s) for /: 'complex' and 'Time'

答案 2 :(得分:3)

您需要实施__rtruediv____rfloordiv__

来自the documentation

object.__radd__(self, other)
object.__rsub__(self, other)
object.__rmul__(self, other)
object.__rmatmul__(self, other)
object.__rtruediv__(self, other)
object.__rfloordiv__(self, other)
object.__rmod__(self, other)
object.__rdivmod__(self, other)
object.__rpow__(self, other)
object.__rlshift__(self, other)
object.__rrshift__(self, other)
object.__rand__(self, other)
object.__rxor__(self, other)
object.__ror__(self, other)
  

调用这些方法来实现二进制算术运算   (+, - ,*,@,/,//,%,divmod(),pow(),**,&lt;&lt;,&gt;&gt;,&amp;,^,|)with   反射(交换)操作数。只有在调用时才会调用这些函数   左操作数不支持相应的操作[3]和   操作数有不同的类型。 [4]例如,要评估   表达式x - y,其中y是具有的类的实例   如果__rsub__()返回NotImplemented,则会调用y.__rsub__(x)方法,x.__sub__(y)