此问题已在此处有答案:
Overload int() in Python(2个答案)
4天前关闭。
截至4天前,社区正在审查是否重新开放此问题。
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
?
2条答案
按热度按时间nx7onnlm1#
__int__
,__float__
,...特殊方法和其他各种方法不会覆盖它们各自的类型,如int
,float
等。这些方法作为钩子,允许 * 类型 * 请求适当的值。类型仍然会强制提供适当的类型。如果需要的话,可以覆盖
int
和类似的builtins
模块。这可以在任何地方完成,并且具有全局效果。请注意,替换内置类型可能会违反代码对这些类型的假设,例如
type(int(x)) is int
保持true。只有在绝对需要时才这样做。这是一个如何替换
int(...)
的例子。它将破坏int
作为一个类型的各种功能,例如检查继承,除非替换是一个精心制作的类型。完全替换需要模拟初始int
类型,例如通过自定义子类检查,并且对于某些内置操作来说是不完全可能的。gk7wooem2#
来自
__int__
的文档调用以实现内置函数complex()、int()和float()。应返回适当类型的值。
这里你的方法返回一个
list
而不是一个int
,这在显式调用它时有效,但不使用int()
,它检查__int__
返回的类型。这里有一个工作的例子,如果可能是什么,即使用法如果不是很中肯