定义专门用于内置(或非)类型

时间:2016-02-19 14:49:51

标签: python

假设我实现了一个名为MyClass的类。我知道可以为我定义的类实现内置函数专用行为。例如,我可以实现MyClass.__repr__,如果我在MyClass的实例上使用它,将会调用它。由于range也是内置函数,是否可以为range实现MyClass的专门行为?

假设我有一个类,我知道我可以迭代(就像我知道我可以遍历整数)。例如Fraction:

>>> from fractions import Fraction as F
>>> range(F(0,3),F(3,3),F(1,3))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: range() integer end argument expected, got Fraction.

显然我可以使用不同的名称来实现它们。我只是好奇鸭子打字的方法可以走多远。

修改:range(F(0,3),F(3,3),F(1,3))的预期行为是返回[F(0,3), F(1,3), F(2,3)]

编辑:所以我们不关注分数,我再举一个例子。我使用库来获取物理尺寸(品脱)。假设我想从0秒到10秒迭代1秒。

>>> from pint import UnitRegistry
>>> from numpy import arange
>>> ur = UnitRegistry()
>>> arange(0*ur.s, 10*ur.s, 1*ur.s)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: setting an array element with a sequence.
>>> range(0*ur.s, 10*ur.s, 1*ur.s)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "build/bdist.linux-x86_64/egg/pint/quantity.py", line 365, in __int__
pint.errors.DimensionalityError: Cannot convert from 'second' to 'dimensionless'

1 个答案:

答案 0 :(得分:-1)

如果您希望将对象解释为range()的参数,则可以实现__index__

>>> class MyClass:
...     def __index__(self):
...         return 123
... 
>>> x = MyClass()
>>> range(x)
range(0, 123)

但是如果你想自定义range()的行为,那就不可能了。 range()只会根据收到的开始,停止和步骤参数返回整数。您可以通过查看the source for the range object来了解自己。