为什么像abs这样的内置函数适用于numpy数组?

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)

但是,这不适用于内置类型,例如listdict.


Eli*_*sha 5

abs 功能寻找 __abs__方法。

您还可以像numpy一样实现 __abs__在类中方法,以便Abs可以与它们一起使用。

class A(object):
    def __abs__(self):
        return 8

>>> a= A()
>>> abs(a)
8
>>>
Run Code Online (Sandbox Code Playgroud)