Python学习手册之内部方法、操作符重载和对象生命周期
在上一篇文章中,我们介绍了 Python 的类和继承,现在我们介绍 Python 的内部方法、操作符重载和对象生命周期。
查看上一篇文章请点击:https://www.cnblogs.com/dustman/p/10016359.html
内部方法和操作符重载
内部的方法
Python 里有一些特殊的方法,也就是以双下划线开头并且以双下划线结尾的。它们可以是变量如 __doc__,也可以是方法如 __init__。
它们常见用途是操作符重载。这意味着可以自定义类的操作符,允许在这些类上使用加减乘除等运算符。
下面代码实现了__call__方法的对象,相当于重载了 (),可以实现调用功能。 实现非波纳契数列的类。
class Fib():
def __call__(self, *args, **kwargs):
ret = [1,1]
num = int(args[0])
if num == 1:
return [1,]
else:
while len(ret)< num:
ret.append(ret[-1]+ret[-2])
return ret fib = Fib()
print(fib(7))
运行结果:
>>>
[1, 1, 2, 3, 5, 8, 13]
>>>
斐波那契数列,是数学上一个无穷数列。其形式为
,,,,,,……
从第三项开始,每一项都是前两项之和。
类运算重载的方法:
__sub__ 表示运算符 -
__mul__ 表示运算符 *
__truediv__ 表示运算符 /
__floordiv__ 表示运算符 //
__mod__ 表示运算符 %
__pow__ 表示运算符 **
__and__ 表示运算符 &
__xor__ 表示运算符 ^
__or__ 表示运算符 |
表达式 x + y 会被 Python 转换成 x.__add__(y)。但是,如果 x 没有实现 __add__ 方法并且 x 和 y 是不同的类型,那么会调用 y.__radd__(x)。
对于上面提到的所有方法,都有相等的添加 r 前缀的方法。
class Foo:
def __init__(self,text):
self.text = text def __mul__(self, other):
line = "=" * len(other.text)
return "\n".join([self.text,line,other.text]) msg = Foo("Hello")
hello = Foo("I like Python!")
print(msg * hello)
运行结果:
>>>
Hello
==============
I like Python!
>>>
上面例子中,我们定义了类 Foo 的一个乘法方法。
Python 同样提供了数据比较方面的方法。
__it__ 表示运算符 <
__le__ 表示运算符 <=
__eq__ 表示运算符 ==
__ne__ 表示运算符 !=
__gt__ 表示运算符 >
__ge__ 表示运算符 >=
如果类没有实现 __ne__ ,则返回 __eq__ 相反的值。其他运算符之间没有这样的关系。
class FooString():
def __init__(self, name):
self.name = name def __lt__(self, obj):
return self.name == obj.name a = FooString("Python")
b = FooString("Html")
print(a < b)
运行结果:
>>>
False
>>>
类中还有一些方法:
__len__ 可用来做 len()
__getitem__ 可用来做键值读取,适用于 [] 运算符。
__setitem__ 设置给定值的值。
__delitem__ 删除给定键对应的元素
__iter__ 用来遍历对象
__contains__ 用来做 in 操作
还有许多其他的神奇方法,我们在这里就不一一谈论了,例如__call__ 用于将对象作为函数调用,
__init__ ,__str__ 等等用于将对象转换为 Python 基础数据类型。
#把一个类做成一个字典 class Foo():
def __init__(self):
self.data = {}
def __getitem__(self, key):
print('__getitem__', key)
return self.data.get(key) def __setitem__(self, key, value):
print('__setitem',key, value)
self.data[key] = value def __delitem__(self, key): #触发del
print('__delitme__', key) obj = Foo() #实例化Foo
obj['name'] = 'Python' #执行__setitem__
print(obj['name']) #执行__getitem__ del obj["name"]
运行结果:
>>>
__setitem name Python
__getitem__ name
Python
__delitme__ name
>>>
键值读取函数 __getitem__ 还可以根据表达式返回字典中的 key,__setitem__ 设置 key 对应的 value 值。
对象生命周期
一个对象会经历三个生命周期:创建,操作,销毁。
对象生命周期的第一阶段是它类变量和方法的定义。
接下来下一阶段是这个实例的实例化。当 __init__ 被调用是,内存分配给存储实例。在此之前,调用类的 __new__ 方法,这通常仅在特殊情况下会被重写。在此以后,该对象就可以使用了。
现在,其他代码可以通过调用对象上的函数或访问其属性与对象进行交互。最后它使用完毕并可被销毁。
当一个对象被销毁时,分配给它的内存会被释放,并可以用于其他目的。
当对象的引用计数达到零时,对象将销毁。引用计数是指引用对象的变量和其他元素的数量。如果没有任何变量引用它(它的引用计数为零),意味着没有任何东西可以与其交互,因此可以安全地删除它。在此也可以被删除。del 语句将对象的引用计数减少一个,这通常会导致对象被删除。del 语句调用对象的方法 __del__。
在不再需要对象是删除对象的过程称为垃圾收集。对象的引用计数在分配新名称或放在容器 (列表、元组或字典) 中时会增加。当使用 del 删除对象时,对象的引用计数会减少。当对象的引用计数达到零时,Python 会自动删除它。
a=1 # 对象 1 被 变量a引用,对象1的引用计数器为1
b=a # 对象1 被变量b引用,对象1的引用计数器加1
c=a # 对象1 被变量c引用,对象1的引用计数器加1
del a #删除变量a,解除a对1的引用
del b #删除变量b,解除b对1的引用
del c #删除变量C,解除C对1的引用
上面的例子,创建了一个含 1 的对象,对象的计数器加了 3 次,然后对象的计数器减了三次。这时该对象会被自动内存管理销毁。
像 C 这样的低级语言没有这种自动内存管理系统。
“数学就是用来把七成人筛出去的。”
Python学习手册之内部方法、操作符重载和对象生命周期的更多相关文章
- Python学习手册之数据封装、类方法、静态方法和属性函数
在上一篇文章中,我们介绍了 Python 的内部方法.操作符重载和对象生命周期,现在我们介绍 Python 的数据封装.类方法.静态方法和属性函数.查看上一篇文章请点击:https://www.cnb ...
- 《Python学习手册》读书笔记
之前为了编写一个svm分词的程序而简单学了下Python,觉得Python很好用,想深入并系统学习一下,了解一些机制,因此开始阅读<Python学习手册(第三版)>.如果只是想快速入门,我 ...
- 《Python学习手册》读书笔记【转载】
转载:http://www.cnblogs.com/wuyuegb2312/archive/2013/02/26/2910908.html 之前为了编写一个svm分词的程序而简单学了下Python,觉 ...
- Python学习手册(第4版) - 专业程序员的养成完整版PDF免费下载_百度云盘
Python学习手册(第4版) - 专业程序员的养成完整版PDF免费下载_百度云盘 提取码:g7v1 作者简介 作为全球Python培训界的领军人物,<Python学习手册:第4版>作者M ...
- Python学习手册(第4版)PDF高清完整版免费下载|百度云盘
Python学习手册(第4版)PDF高清完整版免费下载|百度云盘 提取码:z6il 内容简介 Google和YouTube由于Python的高可适应性.易于维护以及适合于快速开发而采用它.如果你想要编 ...
- [python学习手册-笔记]002.python核心数据类型
python核心数据类型 ❝ 本系列文章是我个人学习<python学习手册(第五版)>的学习笔记,其中大部分内容为该书的总结和个人理解,小部分内容为相关知识点的扩展. 非商业用途转载请注明 ...
- PostgreSQL学习手册(五) 函数和操作符
PostgreSQL学习手册(五) 函数和操作符 一.逻辑操作符: 常用的逻辑操作符有:AND.OR和NOT.其语义与其它编程语言中的逻辑操作符完全相同. 二.比较操作符: 下面是Post ...
- [python学习手册-笔记]003.数值类型
003.数值类型 ❝ 本系列文章是我个人学习<python学习手册(第五版)>的学习笔记,其中大部分内容为该书的总结和个人理解,小部分内容为相关知识点的扩展. 非商业用途转载请注明作者和出 ...
- global语句(python学习手册422页)
# -*- coding: cp936 -*- #python 27 #xiaodeng #global语句(python学习手册422页) #实际上就是一个名为__builtin__的模块,但是必须 ...
随机推荐
- pt-archiver(数据导入导出工具)
数据导入导出工具pt-archiver 工具可以将MySQL的表数据导出到一个新表或者一个文件,也有自己的应用场景,比如数据归档,删除数据,数据合并等. 具体用法: pt-archiver [OPTI ...
- SQL-SERVER学习(二) 数据表的存储过程
在C语言的程序设计中,会把一个重复使用的功能提取出来,做成一个的函数,这样就可以减少冗余代码,且更方便维护.调用.在面向对象的设计语言中,会把一个重复使用的功能提取出来,做成一个类,同样也是为了减少冗 ...
- iptables:no config file
防火墙规则默认都是在/etc/sysconfig/iptables这个文件中的 出现这个问题,是因为在/etc/sysconfig/目录下没有找到iptables这个文件 可以使用service ip ...
- 32位 64位 获得进程peb的方法
基于上一篇文章,大概了解了peb的获取方法,但是那个方法只能获得当前进程的PEB,不能获得其他的进程的PEB.根据那个思想,获得其他进程PEB则需要注入,得到进程信息,然后进程间通信,将信息返回来,经 ...
- 【深入理解JAVA虚拟机】第二部分.内存自动管理机制.3.垃圾收集器与内存分配策略
1.学习目的 当需要排查各种内存溢出. 内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节. Java内存运行时区域的各个部分,其中程序计数 ...
- kali配置ip,更新源,更新签名
以下是我在简单玩kali时候碰到的一些问题,然后找到的解决办法,能成功解决我当时碰到的问题,如果你有疑问或者碰到不能解决的问题可以在下面评论 ############################# ...
- CSAPP buffer lab记录——IA32版本
CSAPP buffer lab为深入理解计算机系统(原书第二版)的配套的缓冲区溢出实验,该实验要求利用缓冲区溢出的原理解决5个难度递增的问题,分别为smoke(level 0).fizz(level ...
- 使用jmeter使用Jenkins发送自定义消息内容
Jenkins运行成功后,需要发送消息给用户,自己封装了一个rtx的方法,进行发送,配置方法如下: 1.在windows下选择 execute windows batch command,执行我的py ...
- (一)自定义ImageView,初步实现多点触控、自由缩放
真心佩服那些一直专注于技术共享的大神们,正是因为他们无私的分享精神,我才能每天都有进步.近日又算是仔细学了android的自定义控件技术,跟着大神的脚步实现了一个自定义的ImageView.里面涉及到 ...
- MVVM的本质:视图逻辑处理、视图管理、视数中间层
MVVM的核心是将原来Controller中的视图逻辑.视图管理.视数中间层的功能剥离出来,形成单独的模块: 大部分功能与视图相关.少部分与数据相关: 视图逻辑和业务逻辑不通: 解决的问题:UIVie ...