簡體   English   中英

numpy.ndarray的python運算符就像類一樣

[英]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 + 1obj.__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.

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