构造与析构
魔法方法总是被双下划线包围,如__init__,是面向对象的python的一切,能够在适当的时候被自动调用
- __init __(self)
- __new __(cls[,…])
- __del __(self)
前两个为对象的构造器,第三个为对象的析构器
-
构造方法包括创建对象和初始化对象,先执行 __new__方法,再执行__init__方法
-
__new__在__init__之前被调用,__new__的返回值(实例)将传递给__init__方法的第一个参数,给__init__这个实例设置一个参数
-
__init__方法的返回值一定是None
工厂函数
工厂函数就是类对象
python魔法方法通过重写,可以自定义任何对象间的算术运算
__ 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[,modulo]) | 定义当被 power() 调用或 ** 运算时的行为 |
__ Ishift__(self,other) | 定义按位左移位的行为:<< |
__ rshift__(self, other) | 定义按位右移位的行为:>> |
__ and__(self, other) | 定义按位与操作的行为:& |
__ xor__(self, other) | 定义按位异或操作的行为:^ |
__ or__(self, other) | 定义按位或操作的行为: |
在继承的类中调用基类的方法?
使用 super() 这个 BIF 函数。
-
time 模块详解(时间获取和转换)
-时间元组
四个魔法方法(属性访问)
- _getattr _(self, name)
定义当用户试图获取一个不存在的属性时的行为 - _ getattribut _(self, name)
定义当该类的属性被访问的行为 - _ setattr _(self, name,value)
定义一个当属性被设置的行为 - _ deltattr _(self, name)
定义当一个属性被删除时的行为
-
描述符
将某种特殊类型的类的实例指派给另一个类的属性
(至少实现以下至少一个)
- _ get _(self, instance,owner)
用于访问属性,它返回属性的值 - _ set _(self, instance,value)
将在属性分配操作中调用,,不返回任何内容 - _ delete _(self, instance)
控制删除操作,不返回任何内容
-
协议
与其他编程语言中的接口很相似,它规定你哪些方法必须要定义。
在python中,协议更像是一种指南
容器类型的协议
- 如果希望定制的容器是不可变
只需要定义__len__()和__getitem__()方法 - 如果是可变,除了__len__()和__getitem__()方法,还需要定义__setitem__()和__delitem__()两个方法
容器类型
- __ len__(self)
定义当被len()调用时的行为(返回容器中元素的个数) - __ getitem__(self,key)
定义获取容器中指定元素的行为,相当于self[key] - __ setitem__(self,key,value)
定义设置容器中指定元素的行为,相当于self[key] = value - __ delitem__(self,key)
定义删除容器中的元素的行为 - __ reversed__(self)
定义当被reversed()调用时的行为 - __ iter__(self)
定义迭代容器中的元素的行为 - __ contains__(self,item)
定义当使用成员测试运算符(in 或 not in)时的行为
python基于序列的三大容器类指:列表(List)、元组(Tuple)、字符串(String)
迭代器
python提供的两个BIF
- iter()
__ iter__()
返回迭代器本身 - next()
__ next__()
决定了迭代器的规则
-
利用迭代器计算斐波那契数列
class Fibs:
def __init__(self,n=10):
self.a = a
self.b = b
self.n = n
def __iter__(self):
return self
def __next__(self):
self.a,self.b = self.b,self.a+self.b
if self.a > self.n:
raise StopIteration
return self.a
运行结果:
>>>fibs = Fibs()
>>>for each in fibs:
print(each)
1
1
2
3
5
8
>>>fibs = Fibs(20)
>>>for each in fibs:
print(each)
1
1
2
3
5
8
13