col*_*ang 14 python arrays numpy
我感到惊讶的是,它abs
适用于numpy数组,但不适用于列表.这是为什么?
import numpy as np
abs(np.array((1,-2)))
array([1, 2])
abs([1,-1])
TypeError: bad operand type for abs(): 'list'
Run Code Online (Sandbox Code Playgroud)
此外,内置函数sum
也适用于numpy数组.我想这是因为numpy数组支持__getitem__
?但是abs
,如果它依赖于__getitem__
它应该也适用于列表,但它没有.
Mic*_*ild 21
那是因为numpy.ndarray
实现了__abs__(self)
方法.只需为自己的班级提供,并abs()
神奇地工作.对于非内置类型,您也可以在事后提供此功能.例如
class A:
"A class without __abs__ defined"
def __init__(self, v):
self.v = v
def A_abs(a):
"An 'extension' method that will be added to `A`"
return abs(a.v)
# Make abs() work with an instance of A
A.__abs__ = A_abs
Run Code Online (Sandbox Code Playgroud)
但是,这不适用于内置类型,例如list
或dict
.
abs
功能寻找 __abs__
方法。
您还可以像numpy一样实现 __abs__
在类中方法,以便Abs可以与它们一起使用。
即
class A(object):
def __abs__(self):
return 8
>>> a= A()
>>> abs(a)
8
>>>
Run Code Online (Sandbox Code Playgroud)