[英]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__
、 ... 特殊方法和其他各種方法不會覆蓋它們各自的類型,例如int
、 float
等。這些方法用作允許類型請求適當值的鈎子。 這些類型仍將強制提供正確的類型。
如果需要,實際上可以在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.