【发布时间】:2020-04-05 12:22:31
【问题描述】:
Overload int() in Python 中给出了一个返回整数的有效解决方案。
但是,它仅适用于返回 int,而不适用于返回 float,或者说是一个列表:
class Test:
def __init__(self, mylist):
self.mylist = mylist
def __int__(self):
return list(map(int, self.mylist))
t = Test([1.5, 6.1])
t.__int__() # [1, 6]
int(t)
因此t.__int__() 有效,但int(t) 给出TypeError: __int__ returned non-int (type list)。
因此,是否有可能完全覆盖int,可能是__getattribute__ 或metaclass?
【问题讨论】:
-
方法
__int__是一个 toInt 所以它应该返回一个 int 而不是一个列表 -
int、str等的想法是,它们调用底层的__int__、__str__,并进行这种类型检查。根据合同,str(..)应该返回一个string的实例。 -
__int__不会覆盖int。该方法是int在不理解其参数类型时使用的钩子。