python读书笔记2000_流畅的Python读书笔记

webchat.jpg

特殊方法的存在是为了Python解释器调用的,你自己并不需要去调用他们,比如说my_object.len()这种写法是没有的,应该使用len(my_object)。在使用len(my_object)的时候,如果my_object是一个自定义类的对象,那么Python会自己去调用其中你实现的len方法。

1.2 如何使用特殊方法

接下来进入1.2节的学习,承接概要我们可以知道自定义类中特殊方法的调用写法,那么如果是Python内置的类型,比如列表(list)、字符串(str)、字节序列(bytearray)等,那么CPython会抄个近路,len实际上会直接返回PyVarObject里的ob_size属性。PyVarObject是表示内存中长度可变的内置对象的语言结构体。直接读取这个值比调用一个方法快很多。

很多时候,特殊方法的调用是隐式的,比如for i in x:这个语句,背后其实用的是iter(x),而这个函数的背后则是x.iter()方法,当然前提是这个方法在x中被实现了。

通常除非有大量元编程存在,否则直接调用特殊方法的频率会远低于去实现他们的次数。唯一的例外可能是init方法,目的是在你自己的字类的init方法中调用超类的构造器。通过内置的函数(例如len、str、iter等等)来使用特殊方法是最好的选择。这些内置函数不仅会调用特殊方法,而且对于内置类来说,他们速度更快。

1.2.1 模拟数值类型

利用特殊方法,可以让自定义对象通过加号“+”(或是别的运算符)进行运算。

我们首先实现一个二维向量(vector)类

2018-04-17-vector.png

示例 1-2 一个简单的二维向量类1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23from math import hypot

class Vector:

def __init__(self, x=0, y=0):

self.x = x

self.y = y

def __repr__(self):

return 'Vector(%r, %r)' % (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)

接下来对类里面的特殊方法进行操作

1

2

3

4

5

6

7

8

9

10

11

12

13v = Vector(3,4)

v1 = Vector(2,4)

v2 = Vector(2,1)

print(abs(v))

print(v1+v2)

print(v*3)

print(abs(v*3))

Output:

5.0

Vector(4, 5)

Vector(9, 12)

15.0

这里使用+运算符得到的结果也是一个向量,abs函数是一个内置函数,如果输入的是整数或者浮点数,他返回的是输入值的绝对值,如果输入的是复数,那么返回这个复数的模。为了保持一致性,我们的API在碰到abs函数的时候,也应该返回该向量的模。

使用*运算符来实现向量的标量乘法(即向量与数的乘法,得到的结果向量的方向与原向量一致,模变大),接下来看看每个特殊方法的实现。

1.2.2 字符串表示形式

Python有一个内置的函数叫repr,它能把一个对象用字符串的形式表达出来以便辩认,这就是“字符串表示形式”。repr就是用过repr这个特殊方法来得到一个对象的字符串形式的。如果没有实现repr,当我们在控制台打印一个向量的实例时,得到的字符串可能会是。repr

交互式控制台和调试程序(debugger)用repr函数来获取字符串表示形式;在老的使用%符号的字符串格式中,这个函数返回的结果用来代替%r所代表的对象;同样str.format函数所使用的新式字符串格式化语法也是利用了repr,才!r字段变成字符串

在repr的实现中,我们用到了%r来获取对象各个属性的标准字符串表示形式,它暗示了一个关键:Vector(1,2)和Vector(‘1’,’2’)是不一样的,后者在我们的定义中会报错,因为向量对象的构造函数只接受数值,不接受字符串。

repr和str的区别在于,后者是在str()函数被使用,或是在用print函数打印一个对象的时候才被调用的,并且它返回的字符串对终端用户更友好。(%s对应于str()处理后的对象,%r对应于repr()处理后的对象)

1.2.3 算术运算符

通过add和mul,示例1-2为向量类带来了+和*这两个算术运算符,这两个方法中的返回值都是新创建的向量对象,被操作的两个向量(self或other)还是原封不动,代码里只是读取了它们的值。中缀运算符的基本原则就是不改变操作对象,而是产出一个新的值。

1.2.4 自定义的布尔值

为了判定一个值x为真还是为假,Python会调用bool(x),这个函数只能返回True或者False。

默认情况下,我们自己定义的类的实例总被认为是真的,除非这个类对bool或者len函数有自己的实现。bool(x)的背后是调用bool()的结果,如果不存在bool方法,那么bool(x)会尝试调用x.len()。若返回0,则bool会返回False,否则返回True。

我们自己定义的类中,bool方法的实现比较简单,如果向量的模是0,那么返回False,其他情况返回True。

如果想让Vector.bool更高效,可以采用这种实现:1

2def __bool__(self):

return bool(self.x or self.y)

因为只有横坐标和纵坐标同时为0时该向量模为0,所以只要取两坐标的“或”值,同时为0时才返回0 来代替abs到abs到平方再到平方根这些中间步骤。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346450.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

antd 3升级命令_是时候拥有一个你自己的命令行工具了

本篇博客主要介绍了如何使用commander, inquirer以及chalk从零开始,创建属于自己的命令行工具。0. 一分钟体验首先我们先花一分钟的时间,体验一下创建自己的命令行cli工具是什么感觉。0.1. 新建项目目录假如我们的项目名称叫hello-cli,使用如…

找不到要去的声明_老汉将行李袋交由他人看管 去了一趟卫生间找不到人了.........

春节走亲访友难免多喝两杯,但酒后乘车却容易造成财物遗失。目前正值春运返程高峰,从沧州女儿家返程回山东老家的蔡先生就因为中午多喝了几杯酒,便将装有12000元生活费的行李袋弄丢了。好在沧州火车站派出所民警最终将蔡先生的失物找回&#x…

java可视化压缩_web可视化技术发展(1/6)

EverCraft一直在关注Web可视化技术的发展,在本系列文章里,小编将对国外一篇感觉很不错的综述性文章进行翻译,供这一领域的爱好者相互学习。这篇paper的信息为:“Mwalongo, F., et al., State-of-the-Art Report in Web-based Visu…

屏幕坏点检测图片_电视屏幕出现坏点?行家会这样做!

液晶电视经常会有几个亮点或暗点,这些通常被称为电视坏点。作为强迫症患者,面对这些屏幕坏点我们应该怎么做?下面跟小智聊聊这个问题吧!首先,坏点形成的原因首先是因为液晶屏幕由很多点组成,每个点由RGB三原…

Java:GraalVM数据库流性能

GraalVM是JVM块的新成员。 它是一个开源虚拟机,能够同时运行多种编程语言,例如Java,Rust和JavaScript。 GraalVM还有一个新的内部代码优化器管道,在某些情况下,与其他JVM相比,它可以显着提高性能。 了解如何…

kubelet启动失败_kubelet 架构浅析

一、概要kubelet 是运行在每个节点上的主要的“节点代理”,每个节点都会启动 kubelet进程,用来处理 Master 节点下发到本节点的任务,按照 PodSpec 描述来管理Pod 和其中的容器(PodSpec 是用来描述一个 pod 的 YAML 或者 JSON 对象…

shell 提取sql 的字段名表名_SQL代码风格规范

作为新时代SQL Boy,大部分时间都是在写sql,很多时候看到别人写的代码实在是不规范,命名随便写,没有缩进,看起来很没有逻辑性,今天分享下我自己的一些规范,从这里修改而来。--名称:xx…

亚马逊ec2 实例删除_亚马逊免费使用套餐:在EC2 Linux实例上安装Tomcat 7

亚马逊ec2 实例删除Amazon Web Services提供了12个月的免费使用期限,使开发人员可以在云中运行任何他们想要的东西。 免费层包括14个服务,其中Web开发人员最关注EC2服务。 EC2是一项服务,通过停止和启动Windows和/或Linux的虚拟实例来提供可调…

使用混合多云每个人都应避免的3个陷阱(第4部分)

每天都在肆意宣传云,但每个人都应避免三个陷阱。 从云,混合云到混合多云,您被告知这是确保业务数字化未来的一种方式。 您必须做出的这些选择不会排除提高客户体验和敏捷交付这些应用程序的日常工作。 让我们开始一段旅程,仔细研…

Java,JavaFX的流畅设计风格拨动开关

嗨,这次我将在新版本的JMetro中讨论新的Toggle Switch样式。 拨动开关是一种近年来变得非常流行的控件。 我前一段时间在ControlsFX库中添加了JavaFX实现。 刚刚发布的JMetro版本4.1中提供了此新样式。 什么是拨动开关 在以前的文章中,我谈到了切换开…

python解析多层嵌套json_Python爬虫解析多个嵌套JSON,多级,json

Python爬虫解析多级嵌套json最近刚接触Python爬虫,正好最近肺炎在全国蔓延,所以准备从网站爬取肺炎实时数据,并解析自己想要的数据。获取json数据网址为 https://m.look.360.cn/events/feiyan爬取网址:def main():urlhttps://m.lo…

如何使用vps 异地组网_使用ZEROTIER异地组建内网(局域网)

一、注册账号(该网站打开比较慢,但并不影响组网后的网速)二、建立虚拟局域网网(获取Network ID)1.选择菜单栏的Networks菜单2.选择创建网络3.注意获取到的Network ID(需要在每台组网的电脑上加入这个network id)4.大部分设置默认就可以了.三、下载软件点菜单中的Dow…

编写一个watchdog.sh脚本_五大原因!为何要将Jupyter Notebook转换为python脚本?

全文共3360字,预计学习时长9分钟图源:unsplash大多数数据科学在线课程都把Jupyter Notebook作为教学媒介,这是因为初学者在Jupyter Notebook的单元格中编写代码,比编写包含类和函数的脚本更容易。另一个原因在于它使浏览和绘制数据…

java 多线程 总结_Java 多线程总结

昨天熬了个通宵,看了一晚上的视频,把java 的多线程相关技术重新复习了一遍,下面对学习过程中遇到的知识点进行下总结。首先我们先来了解一下进程、线程、并发执行的概念:进程是指:一个内存中运行的应用程序&#xff0c…

基本服务-使用大使网关

这是我对Knative服务进行实验的延续,这次是围绕在Knative服务应用程序之上构建网关。 这是基于我之前的两篇文章- 使用Knative部署Spring Boot App以及在Knative中进行服务到服务的调用 。 为什么在Knative应用程序之上使用网关 为了解释这一点,让我谈谈…

mysql function 表名作为参数_mysql 常用的分组聚合函数

mysql 常用的分组聚合函数1.聚合运算一般情况下,需要的聚合数据(和,平均值,最大,最小等)并不总是存储在表中,但是可以执行存储数据的计算来获取它.根据定义,聚合函数对一组值执行计算并返回单个值.MySQL提供了许多聚合函数,包括AVG,COUNT,SUM,MIN,MAX等.除COUNT函数外,其它聚合…

java加减乘除运算顺序_java 实现加减乘除混合运算

初衷:解决小学一年级到四年级 基本加减乘除混合运算基本思路:表达式:10032-200(10000/5(100/2))此类表达式我们称之为中缀表达式(运算符在数字的中间),如果我们稍加转换,转化为100, 3, , 2, , 200, -, 10000, 5, /, 100, 2, /, , …

java integer valueof_对 Java Integer.valueOf() 的一些了解

从一道选择题开始分析选项A选项A中比较的是i01和i02,Integer i0159这里涉及到自动装箱过程,59是整型常量,经包装使其产生一个引用并存在栈中指向这个整型常量所占的内存,这时i01就是Integer 的引用。而int i0259由于int是基本类型…

java web 伪静态_【Java Web】使用URLRewrite实现网站伪静态

大部分搜索引擎都会优先考虑收录静态的HTML页面,而不是动态的*.jsp、*.php页面。但实际上绝大部分网站都是动态的,不可能全部是静态的HTML页面,因此互联网上大部分网站都会考虑伪静态——就是将*.jsp、*.php这种动态URL伪装成静态的HTML页面。…

使用Spring WebFlux从Corda节点流式传输数据

自上次发布以来已经有一段时间了,但我终于回来了! 由于我仍在我的项目中,因此我将再次撰写有关使用Corda的文章。 这次,我们将不再关注Corda,而是将Spring与Corda结合使用。 更具体地说,Spring WebFlux。 为…