我有一个名为Time
的类,我需要实现一个Frequency
类。如何通过int
的实例实现float
或Time
分割以获取Frequency
的实例?
我已经了解__div__
,__truediv__
,__floordiv__
和其他Python特殊方法,我已经在我的代码中使用它们来按类别或其他类的实例划分类的实例,但我找不到用我的班级实例来划分数字的方法。
是否可以通过Python中的类实例来划分数字?
答案 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
。
二进制应返回的特殊值 特殊方法(例如
__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__
。
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)
。