Python提供内置的数据模型,并且尽可能地使得内置的函数和功能,因为这样速度会更快,除非有必要,否则不要实现自己的特别函数,因为内置的函数是基于C代码进行优化的。
好处
拥有和 Python 内建类型一致的 API (len)
获得 Python 特性:切片,迭代
获得 Python 标准库支持:reversed, sorted, random.choice
注意
自己不要使用 __foo__ 的变量名,它们使保留给这些特殊方法/变量使用的
除了 直接调用父类的 __init__ 方法外,一般不直接调用这些特殊的方法,而是使用 len foo[0]。
尽管如此,还是不能满足全部用户的需求的。比如python提供的数学模型,就是为了定制特定的数学运算的,有点像C++里的操作符重载,在这里使用二维向量的运算来演示相关数学模型的操作符功能。
from math import hypot
class Vector:
def __init__(self, x=0, y=0):
self.x = x
self.y = y
def __repr__(self):
return 'Vector({}, {})'.format(self.x, self.y)
def __abs__(self):
return hypot(self.x, self.y)
def __bool__(self):
return bool(abs(self))
def __add__(self, other):
x = self.x + other.x
y = self.y + other.y
return Vector(x, y)
def __mul__(self, scalar):
return Vector(self.x * scalar, self.y * scalar)
v1 = Vector(1,2)
v2 = Vector(1,2)
print(v1+v2)
在这里相关代码解释如下:
__repr__函数实现打印输出时的表示方式,如果不实现这个函数,默认输出是对象的内存信息,比如:<__main__.Vector object at 0x000002711FD1DB48>。__repr__和__str__都是字符串的显示,二者的目的不同,__str__是为了给最终用户提供实例对象的信息,__repr__是给开发人员提供对象的信息;
由于目的不同,二者展示的信息应该不同,__str__应该提供用户容易理解的信息,将属性代码翻译成客户理解的文字说明,__repr__应该提供开发者容易使用的信息,最好是能够直接使用输出的信息直接拷贝部分或全部就能重定义一个对象,这些信息类似于集成环境下debug看内存数据对象的格式差不多;
二者触发调用的方式不同,__str__是在print(对象)、str(对象)等情况下调用,__repr__是在查看对象、repr(对象)等情况下调用;
__abs__函数实现取绝对值的功能,比如调用函数abs()时会调用。
__bool__函数实现逻辑运算的功能。
__add__函数实现两个向量相加的功能。
__mul__函数实现两个向量相乘的功能。
python提供了很多内置函数,就是为了更方便地表示数学的模型,同时方便使用python内置的函数来进行计算。
更多关于内置函数的功能,可以看下面的网页:
https://docs.python.org/3/reference/datamodel.html
玩转人工智能库-深入浅出OpenCV
https://edu.csdn.net/course/detail/26616