首页 > 编程 > Python > 正文

Python进阶学习之特殊方法实例详析

2020-02-16 10:54:15
字体:
来源:转载
供稿:网友

前言

最近在学习python,学习到了一个之前没接触过的--特殊方法。

什么是特殊方法?当我们在设计一个类的时候,python中有一个用于初始化的方法$__init__$,类似于java中的构造器,这个就是特殊方法,也叫作魔术方法。简单来说,特殊方法可以给你设计的类加上一些神奇的特性,比如可以进行python原生的切片操作,迭代、连乘操作等。在python中,特殊方法以双下划线开始,以双下划线结束。

一个大例子

数学中有一个表示数的概念叫做向量,但是python中的数据类型却没有。我们来设法用python实现它。

首先考虑,向量跟普通的数据类型不同,传统的数可以直接进行运算,向量则需要对不同的坐标分别运算。来试试。

首先定义一个类,实现初始化方法。

# 实现向量类型class Vector:  def __init__(self, x=0, y=0):  self.x = x  self.y = y

如何实现向量的加法?二维向量中,向量的加法就是每个坐标分别相加得到的结果。在python中有个$__add__$方法,用来进行加法操作。

class Vector:  def __init__(self, x=0, y=0):  self.x = x  self.y = y # 实现向量加法 def __add__(self, other):  x = self.x + other.x  y = self.y + other.y  return Vector(x, y)

我们对x和y变量分别进行相加,然后返回Vector。在python你可以对字符串直接用加法拼接起来的原理就在此,python实现了针对字符串的add方法。

实现了加法,乘法的道理一样,分别对每个坐标单独相乘即可。

class Vector:  def __init__(self, x=0, y=0):  self.x = x  self.y = y # 实现向量加法 def __add__(self, other):  x = self.x + other.x  y = self.y + other.y  return Vector(x, y)  # 实现向量乘法,例如r*3 def __mul__(self, scalar):  return Vector(self.x*scalar, self.y*scalar)

我们在进行向量运算时还有一个常用的操作是求向量的模,我们用$__abs__$特殊方法来实现,abs一般用来求一个数的绝对值,向量用不到,用来求模刚好合适。使用math模块中的hypot方法计算$/sqrt(x^2+y^2)$。

class Vector:  def __init__(self, x=0, y=0):  self.x = x  self.y = y  # 真假值,如果向量模为0,返回false 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)  # 实现向量乘法,例如r*3 def __mul__(self, scalar):  return Vector(self.x*scalar, self.y*scalar)  # 返回向量的模 # hypot()返回欧几里德范数 sqrt(x*x + y*y) def __abs__(self):  return hypot(self.x, self.y)

找个例子运行下。

v = Vector(2, 3)print(v)v2 = Vector(4, 5)print(v+v2)print(v+v2*2)
<__main__.Vector object at 0x000002B4B1843C50><__main__.Vector object at 0x000002B4B1843EF0><__main__.Vector object at 0x000002B4B1843898>            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表