阿里云天池Python训练营

阿里云天池Python训练营

 

本节主要介绍python中的魔法方法,并针对相关用法进行展开说明。其中拓展了需要掌握及区别的内容,对于魔法方法的含义需重点掌握。

 

一、魔法方法

 

魔法方法总能够在适当的时候被自动调用

魔法方法的第一个参数应为cls(类方法) 或者self(实例方法)

cls:类的名称

self:实例对象的名称

 

1. 基本的魔法方法

__init__(self[, ...])

创建实例时 调用的初始化方法

__new__(cls[, ...])

对象实例化时调用的第一个方法(调用__init__前先调用__new__

__new__至少有一个参数cls 代表实例化的类(Python 解释器自动提供)后面的参数传递给__init__

__new__实例化当前类 传给__init__self (只有__new__返回当前类cls的实例 才会进入__init__

__new__没有正确返回当前类cls的实例 不会被调用__init__ 父类的实例也不可以

__new__用于继承不可变的 classint str tuple) 时 提供一个自定义类实例化过程的途径

__del__(self)

当对象被系统回收时调用的方法

Python 采用自动引用计数(ARC)方式来回收对象所占用的空间 当对象的引用计数变成了 0  Python 就会回收该对象

系统中出现循环引用的情况 由专门的循环垃圾回收器(Cyclic Garbage Collector)来检测并回收引用循环

__str__(self):

打印一个对象时 触发__str__

使用%s格式化时 触发__str__

str强转数据类型时 触发__str__

__repr__(self):

__str__时执行__str__ 没有实现__str__时 执行__repr__

repr(obj)的结果是__repr__返回值

使用%r格式化的时候 触发__repr__

__str__(self) 结果可读性强 __str__ 可以得到便于阅读的信息

__repr__(self) 结果更准确 __repr__ 常用于调试 便于开发者使用

 

2. 算术运算符

类型工厂函数 不通过类而是通过函数来创建对象

__add__(self, other)

加法的行为:+

__sub__(self, other)

减法的行为:-

__mul__(self, other)

定法的行为:*

__truediv__(self, other)

除法的行为:/

__floordiv__(self, other)

整数除法的行为://

__mod__(self, other)

取模算法的行为:%

__divmod__(self, other)

divmod() 调用行为

divmod(a, b)把除数和余数运算结果结合起来 返回一个包含商和余数的元组(a // b, a % b)

__pow__(self, other[, module])

power() 调用或幂运算行为:**

__lshift__(self, other)

按位左移位的行为:<<

__rshift__(self, other)

按位右移位的行为:>>

__and__(self, other)

按位与操作的行为:&

__xor__(self, other)

按位异或操作的行为:^

__or__(self, other)

按位或操作的行为:|

 

3. 反算术运算符

反运算魔方方法 在魔法方法多了一个“r”

当文件左操作不支持相应的操作时被调用

__radd__(self, other)

加法的行为:+

__rsub__(self, other)

减法的行为:-

__rmul__(self, other)

定法的行为:*

__rtruediv__(self, other)

除法的行为:/

__rfloordiv__(self, other)

整数除法的行为://

__rmod__(self, other)

取模算法的行为:%

__rdivmod__(self, other)

divmod() 调用行为

__rpow__(self, other[, module])

power() 调用或幂运算行为:**

__rlshift__(self, other)

按位左移位的行为:<<

__rrshift__(self, other)

按位右移位的行为:>>

__rand__(self, other)

按位与操作的行为:&

__rxor__(self, other)

按位异或操作的行为:^

__ror__(self, other)

按位或操作的行为:|

 

4. 增量赋值运算符

__iadd__(self, other)

加法的行为:+=

__isub__(self, other)

减法的行为:-=

__imul__(self, other)

定法的行为:*=

__itruediv__(self, other)

除法的行为:/=

__ifloordiv__(self, other)

整数除法的行为://=

__imod__(self, other)

取模算法的行为:%=

__ipow__(self, other[, module])

幂运算的行为:**=

__ilshift__(self, other)

按位左移位的行为:<<=

__irshift__(self, other)

按位右移位的行为:>>=

__iand__(self, other)

按位与操作的行为:&=

__ixor__(self, other)

按位异或操作的行为:^=

__ior__(self, other)

按位或操作的行为:|=

 

5. 一元运算符

__neg__(self)

正号的行为:+x

__pos__(self)

负号的行为:-x

__abs__(self)

绝对值行为:|x|

__invert__(self)

按位求反的行为:~x

 

6. 属性访问

__getattr__(self, name):

试图获取不存在的属性时的行为

__getattribute__(self, name):

类的属性被访问时的行为(先调用方法查看是否存在该属性 若不存在则调用__getattr__)

__setattr__(self, name, value):

设置属性时的行为

__delattr__(self, name):

删除属性时的行为

 

7. 描述符

描述符将特殊类型的类的实例指派给另一个类的属性

__get__(self, instance, owner)

访问属性 返回属性值

__set__(self, instance, value)

将在属性分配操作中调用

__del__(self, instance)

删除操作

 

8. 定制序列

容器类型的协议

容器是不可变的 只需定义__len__()__getitem__()方法 

容器是可变的 需要定义__len__() __getitem__() __setitem__()__delitem__()方法

__len__(self)

调用len()的行为(返回容器中元素的个数)

__getitem__(self, key)

获取容器中元素的行为(self[key]

__setitem__(self, key, value)

设置容器中元素的行为(self[key] = value) 

__delitem__(self, key)

删除容器中元素的行为(del self[key]

 

9. 迭代器

迭代器是访问集合元素的一种方式 可以记住遍历位置的对象 

迭代器对象从集合的第一个元素开始访问 直到所有的元素被访问后结束 (只往前不后退)

字符串 列表或元组对象都可用于创建迭代器

基本的方法:iter() 和 next()

iter(object)

生成迭代器

next(iterator[, default])

返回迭代器的下一个项目

iterator:可迭代对象

default :当没有下一个元素时返回的默认值 如果不设置则会触发 StopIteration 异常

把类作为迭代器使用需要在类中实现两个魔法方法 __iter__() 与 __next__()

__iter__(self)

得到特殊的迭代器对象 实现__next__() 方法并通过 StopIteration 异常标识迭代完成

__next__()

返回下一个迭代器对象

StopIteration 异常用于标识迭代的完成 防止出现无限循环的情况

 __next__() 方法中可以设置指定循环次数后触发 StopIteration 异常来结束迭代

 

10.生成器

生成器:使用 yield 的函数

生成器返回的是迭代器对象 只能用于迭代操作

调用生成器时 每次遇到 yield 时函数会暂停并保存当前运行信息 返回 yield 的值 下一次执行 next() 方法时从当前位置开始

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值