![](/img/trans.png)
[英]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.