簡體   English   中英

Python:覆蓋 __int__

[英]Python: overwrite __int__

在 Python 的 Overload int() 中給出了一個返回整數的工作解決方案。

但是,它僅適用於返回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____float__ 、 ... 特殊方法和其他各種方法不會覆蓋它們各自的類型,例如intfloat等。這些方法用作允許類型請求適當值的鈎子。 這些類型仍將強制提供正確的類型。

如果需要,實際上可以在builtins模塊上覆蓋int和類似內容。 這可以在任何地方進行,並具有全球影響。

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成立。 只有在絕對需要時才這樣做。

這是如何替換int(...)的示例。 它將破壞int類型的各種特性,例如檢查 inheritance,除非替換是精心設計的類型。 完全替換需要模擬初始int類型,例如通過自定義子類檢查,並且對於某些內置操作來說是不可能的。

來自__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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM