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

作者:zhuzhezhe 时间:2022-03-03 22:15:04 

前言

最近在学习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>

可以运行了,貌似是正确的,但是输出的结果很奇怪。怎么办?python中有个$__repr__$特殊方法,可以修改控制台输出的样式。


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)

# 实现__repr__方法,在控制台打印向量时会输出Vector(1, 2)
# 实现__str__,使用str()返回字符串
def __repr__(self):
 return 'Vector(%r, %r)' % (self.x, self.y)

实现了$__repr__$方法,我们就可以在控制台输出Vecotor(x,y)。与之对应的有个$__str__$方法,使用str()返回相应的字符串,展示给用户。

现在来看下之前程序运行的结果。


v = Vector(2, 3)
print(v)
v2 = Vector(4, 5)
print(v+v2)
print(v+v2*2)
print(abs(v))

Vector(2, 3)
Vector(6, 8)
Vector(10, 13)
3.605551275463989

效果不错。

通过实现特殊方法,自定义类型可以表现的跟内置类型一样,让我们能够写出更具有python风格的代码。

除了上面说到的几个特殊方法外,python还有差不多80多个特殊方法,比如$__len__$方法可以用来求长度,$__getitem__$可以使用haha[2]之类的操作进行切片和迭代等,同样的还有$__setitem__$。

来源:https://segmentfault.com/a/1190000012223818

标签:python,特殊方法
0
投稿

猜你喜欢

  • 详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数

    2023-08-21 15:36:40
  • python pandas 如何替换某列的一个值

    2021-07-01 01:08:07
  • Python中urllib+urllib2+cookielib模块编写爬虫实战

    2023-10-21 19:02:35
  • Python编写车票订购系统 Python实现快递收费系统

    2023-06-26 15:37:26
  • 通过 for 循环比较 Python 与 Ruby 的编程区别

    2022-11-12 01:19:26
  • 解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了

    2023-06-13 19:13:36
  • Python中使用scapy模拟数据包实现arp攻击、dns放大攻击例子

    2021-12-04 12:15:05
  • python如何导入自己的模块

    2022-05-21 08:14:57
  • 在python3.9下如何安装scrapy的方法

    2023-11-26 10:39:58
  • oracle 删除重复数据

    2009-07-23 14:46:00
  • 详解Django之admin组件的使用和源码剖析

    2022-10-07 06:36:27
  • Python面向对象class类属性及子类用法分析

    2021-07-22 03:04:46
  • asp空间判断jmail组件是否安装或支持的代码

    2011-02-16 10:49:00
  • Python合并重叠矩形框

    2023-06-11 02:33:41
  • pyecharts实现数据可视化

    2023-05-24 06:18:48
  • 挑战! 纯Javascript 重现经典网游! <魔力宝贝>

    2008-10-04 10:37:00
  • python实现从文件中读取数据并绘制成 x y 轴图形的方法

    2023-04-09 22:43:41
  • Python之split函数的深入理解

    2022-12-22 19:58:25
  • Python用类实现扑克牌发牌的示例代码

    2021-01-07 10:07:07
  • Django 用户认证组件使用详解

    2021-05-11 12:44:25
  • asp之家 网络编程 m.aspxhome.com