- 魔法方法总是被双下划线包围,例如_init_
- 魔法方法是面向对象的Pyton的一切
- 其魔力体现在总能够在适当的时候被调用
构造和析构
-
init(self[,…])
类在实例化方法的时候首先会调用的一个方法。例如下例,需要在类定义的时候传入参数,则需要对类重写:
注:init() 自身不能有返回值。 -
new(cls[,…])
cls:类。
当继承一个不可变类型的类需要进行修改的时候,即需要魔法方法的重写功能。
-
del(self)
如果说init和new方法是对象的构造器,那么del为一个析构器。
只有当所有指向对象的引用都被删除的时候才会启用垃圾回收机制,而垃圾回收机制销毁对象的时候才会调用_del_方法。
工厂函数
注:真除法指除完以后带小数;mod取余数;divmod(a,b)返回的值是一个元组:(a//b,a%b),例如5除以3余2,则返回值为2;pow为进行幂运算;我们所理解的最小存储单位是字节,CPU理解的是位(二进制),一个字节8位,故按位左移右移是指二进制下的位数移动。
此时会进入无限递归的状态,因为return中的正好是_add_()中的参数,修正后:
其中,int即为被覆盖的工厂函数。
附件:Python 魔法方法详解
反运算:
a+b因为都有_add_方法所以为触发_radd_;当1+b时,因为1没有该方法,故直接触发b的_radd_方法,同时b是带入的self位置,故返回2。
同样,
因为3-a中3没有对应方法,触发a的时候即为a-3;若想3-a需要改变other和self位置。
一元操作符
abs()为取绝对值;按位求反指0变1,1变0。
类的定制(习题课)
需要的资源:
扩展阅读链接:time 模块详解(时间获取和转换)
表现类时,若想实现输入变量就能返回一个值则需要该两个方法对方法重写:
正式编写:
运行结果:
由于时间的该进阶机制,所以当时间过长的时候会出现下列错误:
属性访问
例如:
课堂练习:
此处应注意使用基类super防止进入无限递归;调用后:
基类也可以使用_dict_代替:
描述符
描述符就是将某种类型的类的实例指派给另一个类的属性。而特殊类型即要实现以下三个或其中一个:
get(self,instance,owner)
用于访问属性,他返回属性的值
set(self,instance,value)
将在属性分配操作中调用,不返回任何内容
delete(self,instance)
控制删除操作,不返回任何内容