2016-02-19 41 views
1

假設我實現了一個名爲MyClass的類。我知道可以爲我定義的類實現內置函數專門的行爲。例如,我可以實現MyClass.__repr__,如果我在MyClass的實例上使用它,將會調用它。因爲range也是一個內置函數,是否有可能爲MyClass實現range的專門行爲?定義專門用於內置(或不)類型的python內置範圍

讓我們假設我有一個類,我知道我可以迭代(就像我知道我可以迭代整數)。例如分數:

>>> 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

[Python十進制範圍()步長值](http://stackoverflow.com/a/477610/2301450) – vaultah

+0

是的,他們定義了另一個名爲'whatever_range'的方法,它可以工作。我想知道是否可以實現它,以便當我調用'range'時,它會調用我的'whatever_range'。 – Emilien

+0

'range = whatever_range',或更改CPython的源代碼。 – vaultah

回答

-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

+0

這是否解決了'fractions.Fraction'的問題? – vaultah

+0

有趣,但它並不完全是我問的,因爲我想範圍返回一個迭代器在MyClass類型的對象上。 – Emilien

+0

@vaultah:分數不是整數類型,它們沒有任何意義讓他們實現'__index__' –