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. li每三个换行

      背景:鉴于有时候调取数据用table不方便,所以用的li,但是li又没有table的样式,就需要自己写了 思路:先将所有的li浮动,然后清除第3n+1的浮动(如果是四个则是4n+1) 例子: &l ...

  2. Linux/Ubantu 安装 idea

    wget 使用 wget url (这里的url就是你要下载idea的网站) 在idea官网中 找到 direct link 右键复制链接 在 linux 中 打开 终端命令窗口 (Ctrl +Alt ...

  3. JAVA-IO流大文件拷贝

    package com.test.io; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import ...

  4. Ubuntu 16.04安装docker详细步骤

    1. 卸载之前的旧版本 sudo apt-get remove docker docker-engine docker-ce docker.io 2. 更新apt包 sudo apt-get upda ...

  5. BZOJ 1107: [POI2007]驾驶考试egz / Luogu P3463 [POI2007]EGZ-Driving Exam (树状数组 LIS)

    能从iii走到所有跑道 相当于 能从iii走到111和nnn. 边反向后就相当于 能从111和nnn走到iii. 为了方便叙述,把111~nnn叫做x坐标,111~(m+1)(m+1)(m+1)叫做y ...

  6. 强制类型转换之String类型

    ㈠布尔(Boolean)类型 布尔值只有两个,主要用来做逻辑判断 true   表示真 :   false   表示假 使用typeof检查一个布尔值时,会返回boolean   ㈡Null和Unde ...

  7. [Python]token的生成及验证

    hmac模块(仅在python3中可以使用) 简介: HMAC是密钥相关的哈希运算消息认证码,HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出. 典型应用: HMAC的一 ...

  8. 包管理神器-pipenv

    一:前言 介绍一个包管理神器-pipenv,这个工具可以让我们在写代码.创建Python运行环境.package依赖关系以及项目合作的时候更有效率. 在pycon2018上,Kenneth Reitz ...

  9. ettercap局域网DNS切换到恶意网址

    ettercap -i eth0 -Tq -M arp:remote -P dns_spoof /// /// Dns欺骗--Ettercap工具进行Dns欺骗 转载至 https://blog.cs ...

  10. linux 分区管理

    1. 查看系统中硬盘的设备 [root@centos6 ~]# ls /dev/sd* /dev/sda /dev/sda1 /dev/sda2 /dev/sda3 /dev/sdb 可以看出,系统有 ...