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

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值

Python进阶学习之特殊方法实例详析的更多相关文章

  1. Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究

    Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究 一丶反射 什么是反射: ​ 反射的概念是由Smith在1982年首次提出的 ...

  2. C#操作SQLite方法实例详解

    用 C# 访问 SQLite 入门(1) CC++C#SQLiteFirefox  用 C# 访问 SQLite 入门 (1) SQLite 在 VS C# 环境下的开发,网上已经有很多教程.我也是从 ...

  3. Python深入学习之特殊方法与多范式

    Python深入学习之特殊方法与多范式 Python一切皆对象,但同时,Python还是一个多范式语言(multi-paradigm),你不仅可以使用面向对象的方式来编写程序,还可以用面向过程的方式来 ...

  4. 魔法方法推开Python进阶学习大门

    热爱Python Python是Guido van Rossum设计出来的让使用者觉得如沐春风的一门编程语言.2020年11月12日,64岁的Python之父宣布由于退休生活太无聊,自己决定加入Mic ...

  5. python进阶学习笔记(一)

    python进阶部分要学习的内容: 学习目标: 1.函数式编程 1.1,什么是函数式编程 函数式编程是一种抽象计算的编程模式 不同语言的抽象层次不同: 函数式编程的特点: python支持的函数式编程 ...

  6. python进阶学习笔记(三)

    3.类的继承 3.1,python中什么是类的继承 答案是肯定的. 也就是说,如果一个实例是一个子类,那么它也是一个父类 总是从某各类继承,如果没有合适的类,就要从object类继承:super(). ...

  7. Python进阶 学习笔记(三)

    (涉及内容:定制类) __str__和__repr__ 如果要把一个类的实例变成 str,就需要实现特殊方法__str__(): class Person(object): def __init__( ...

  8. python进阶之类常用魔法方法和魔法属性

    前言 前面我们总结过了python的关键字.运算符.内置函数.语法糖等与python魔法方法之间的关系,现在我们更细一点,看看python的面向对象编程有哪些常用的魔法属性和魔法方法. 魔法属性 对于 ...

  9. Python学习day07 - Python进阶(1) 内置方法

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

随机推荐

  1. Vue快速学习_第五节

    axios安装及使用 网站文档地址:https://www.kancloud.cn/yunye/axios/234845 1.npm安装 cnpm install axios 2.// 在main.j ...

  2. 箭头函数 -ES6

    1)函数参数只有一个:可以省略 ( ) var f = a => a     等同于 var f = function (a) { return a } 2)函数内部语句只有一个:可以省略 { ...

  3. hive的事物性 transaction manager

    create table lk3 (id string,nname string,grade int,goldUser int); insert into lk3 values (,, ), (,, ...

  4. ingress部署

    # 手动部署 # 部署ingress-nginx 官方地址:https://github.com/kubernetes/ingress-nginx # 参考链接:https://www.jianshu ...

  5. Oracle之:Function :dateToNumber()

    create or replace function dateToNumber(i_date in date) return number is result number ; begin resul ...

  6. [Javascirpt] What’s new in JavaScript (Google I/O ’19)

    Private variable in class: class Counter { #count = 0; // cannot be access publicly get value () { r ...

  7. 【Winfrom-Button】 重写Button,去掉获取焦点时的边框

    Winfrom Button 去掉获取焦点时的边框: 自定义一个Button,重写ShowFocusCues方法 /// <summary> /// 去掉获取焦点的边框 /// </ ...

  8. [人物存档]【AI少女】【捏脸数据】精灵

    AISChaF_20191101204710076.png

  9. maven报错1

    错误1 错误2 缺少mapper文件 错误3 缺少映射文件 <!-- 如果不添加此节点mybatis的mapper.xml文件都会被漏掉. --> <build> <re ...

  10. asp.net上传超大文件解决方案

    ASP.NET上传文件用FileUpLoad就可以,但是对文件夹的操作却不能用FileUpLoad来实现. 下面这个示例便是使用ASP.NET来实现上传文件夹并对文件夹进行压缩以及解压. ASP.NE ...