假设我实现了一个名为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'
答案 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来了解自己。