numpy Python:overwrite __int__ [duplicate]

jgzswidk  于 2023-04-12  发布在  Python
关注(0)|答案(2)|浏览(155)

此问题已在此处有答案

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

nx7onnlm

nx7onnlm1#

__int____float__,...特殊方法和其他各种方法不会覆盖它们各自的类型,如intfloat等。这些方法作为钩子,允许 * 类型 * 请求适当的值。类型仍然会强制提供适当的类型。
如果需要的话,可以覆盖int和类似的builtins模块。这可以在任何地方完成,并且具有全局效果。

import builtins

# store the original ``int`` type as a default argument
def weakint(x, base=None, _real_int=builtins.int):
    """A weakly typed ``int`` whose return type may be another type"""
    if base is None:
        try:
            return type(x).__int__(x)
        except AttributeError:
            return _real_int(x)
    return _real_int(x, base)

# overwrite the original ``int`` type with the weaker one
builtins.int = weakint

请注意,替换内置类型可能会违反代码对这些类型的假设,例如type(int(x)) is int保持true。只有在绝对需要时才这样做。
这是一个如何替换int(...)的例子。它将破坏int作为一个类型的各种功能,例如检查继承,除非替换是一个精心制作的类型。完全替换需要模拟初始int类型,例如通过自定义子类检查,并且对于某些内置操作来说是不完全可能的。

gk7wooem

gk7wooem2#

来自__int__的文档
调用以实现内置函数complex()、int()和float()。应返回适当类型的值。
这里你的方法返回一个list而不是一个int,这在显式调用它时有效,但不使用int(),它检查__int__返回的类型。
这里有一个工作的例子,如果可能是什么,即使用法如果不是很中肯

class Test:
    def __init__(self, mylist):
        self.mylist = mylist
    def __int__(self):
        return int(sum(self.mylist))

相关问题