[英]Python: Applying arithmetic operators on list like on numpy.ndarray?
[英]python operators for numpy.ndarray like class
我有一個類,它有一個numpy.ndarray作為成員,並且通過重載__getitem__
和__getattr__
來表現類似於ndarray:
class Foo(object):
def __init__(values):
# numpy.ndarray
self._values = values
def __getitem__(self, key):
return self._values[key]
def __getattr__(self, name):
return getattr(self._values, name)
因此,我可以直接在這個類的對象上使用像shape,size,...這樣的numpy方法。 我也可以做像obj.__add__(1)
這樣的事情,它會給obj._values
增加1。 但是,如果我嘗試obj + 1
它會引發“不支持的操作數類型”。 我想為obj + 1
與obj.__add__(1)
相同的行為。 如果不向Foo
添加__add__
,這可能嗎?
我可以看到你在這里嘗試做什么,但它不會像你認為的那樣工作。 這是Python中非常明顯的微妙之處。
你在想的是你做的obj + 1
Python實際上是在調用obj.__add__(1)
而且,如果沒有在obj
上找到__add__
屬性,它將落到它的__getattr__
。
但這並不完全適用於算術運算符,其實現實際上要復雜得多。 在這種情況下,如果obj
沒有__add__
方法,它將嘗試調用右側操作數的__radd__
(用於“右側添加”)方法,以查看1
知道如何使用左側操作符添加。 它不會讓你得到例外。
還有其他涉及類型插槽的細微之處,我不會介入。
如果您希望您的課程充當ndarray
的代理,您有幾個選擇。 這實際上取決於你實際想要完成什么,你可以考慮在一個單獨的問題中提出。 您可能只能直接子類化 ndarray
並在子類中實現其他功能。
如果你不想要的子類ndarray
您也可以考慮使用代理,如ObjectProxy
從纏住了 。 這可能是也可能不是你想要的。 雖然你仍然可以ndarray
ObjectProxy
以覆蓋你不想要代理的方法,但它會使一個對象像走路,談話, ndarray
,甚至命名為ndarray
。
否則就會有繁瑣的手動方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.