2017-01-11 47 views
1

我寫它實現了__int__方法,這樣一個實例可以表現得像一個整數類:如何爲十六進制的功能支持添加到

class MyClass: 
    def __init__(self, value): 
     self._value = value 

    def __int__(self): 
     return self._value 

使用int功能上的一個實例工作正常,並我認爲其他內置函數是隱式依賴的,例如hex。不過,我得到了以下錯誤消息:

>>> x = MyClass(5) 
>>> int(x) 
5 
>>> hex(x) 
TypeError: 'MyClass' object cannot be interpreted as an integer 

我試圖推行以同樣的方式__hex__方法__int__,但沒有效果。

我該怎麼做才能讓我的課程實例被hex接受?

回答

3

如文檔中被指定爲hex(..),必須定義__index__方法:

hex(x)

(..)

如果x不是一個Python int對象,它必須定義一個__index__()方法返回一個整數

(部分省略,格式化)

因此,對於您的情況大概是:

class MyClass: 
    def __init__(self, value): 
     self._value = value 

    def __int__(self): 
     return self._value 

    def __index__(self): 
     return self.__int__() #note you do not have to return the same as __int__ 

當在控制檯中運行以下命令:

$ python3 
Python 3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> class MyClass: 
...  def __init__(self, value): 
...   self._value = value 
...  
...  def __int__(self): 
...   return self._value 
...  
...  def __index__(self): 
...   return self.__int__() 
... 
>>> foo=MyClass(14) 
>>> hex(foo) 
'0xe' 

如果你想要的hex(..)的「值」是別的,因此可以定義__index__與不同3210雖然我強烈反對這一點。 hex(..)此外還保證它將返回一個正確格式的十六進制數的字符串(str):例如,不能返回元組等,否則將引發TypeError。例如:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: __index__ returned non-int (type tuple) 

if __index__返回一個元組。

相關問題