Python(day.11 魔法方法)

  1. 魔法方法总是被双下划线包围,例如_init_
  2. 魔法方法是面向对象的Pyton的一切
  3. 其魔力体现在总能够在适当的时候被调用

构造和析构

  1. init(self[,…])
    类在实例化方法的时候首先会调用的一个方法。例如下例,需要在类定义的时候传入参数,则需要对类重写:
    Python(day.11 魔法方法)_第1张图片
    注:init() 自身不能有返回值。

  2. new(cls[,…])
    cls:类。
    当继承一个不可变类型的类需要进行修改的时候,即需要魔法方法的重写功能。
    Python(day.11 魔法方法)_第2张图片

  3. del(self)
    如果说init和new方法是对象的构造器,那么del为一个析构器。
    Python(day.11 魔法方法)_第3张图片
    只有当所有指向对象的引用都被删除的时候才会启用垃圾回收机制,而垃圾回收机制销毁对象的时候才会调用_del_方法。

工厂函数

Python(day.11 魔法方法)_第4张图片
注:真除法指除完以后带小数;mod取余数;divmod(a,b)返回的值是一个元组:(a//b,a%b),例如5除以3余2,则返回值为2;pow为进行幂运算;我们所理解的最小存储单位是字节,CPU理解的是位(二进制),一个字节8位,故按位左移右移是指二进制下的位数移动。
Python(day.11 魔法方法)_第5张图片
此时会进入无限递归的状态,因为return中的正好是_add_()中的参数,修正后:Python(day.11 魔法方法)_第6张图片
其中,int即为被覆盖的工厂函数。

附件:Python 魔法方法详解

反运算:

Python(day.11 魔法方法)_第7张图片
a+b因为都有_add_方法所以为触发_radd_;当1+b时,因为1没有该方法,故直接触发b的_radd_方法,同时b是带入的self位置,故返回2。

同样,
Python(day.11 魔法方法)_第8张图片
因为3-a中3没有对应方法,触发a的时候即为a-3;若想3-a需要改变other和self位置。

一元操作符

abs()为取绝对值;按位求反指0变1,1变0。

类的定制(习题课)

Python(day.11 魔法方法)_第9张图片

需要的资源:

Python(day.11 魔法方法)_第10张图片

扩展阅读链接:time 模块详解(时间获取和转换)
表现类时,若想实现输入变量就能返回一个值则需要该两个方法对方法重写:

Python(day.11 魔法方法)_第11张图片

正式编写:

Python(day.11 魔法方法)_第12张图片Python(day.11 魔法方法)_第13张图片

运行结果:

Python(day.11 魔法方法)_第14张图片
Python(day.11 魔法方法)_第15张图片

由于时间的该进阶机制,所以当时间过长的时候会出现下列错误:

Python(day.11 魔法方法)_第16张图片

属性访问

Python(day.11 魔法方法)_第17张图片

例如:

Python(day.11 魔法方法)_第18张图片

课堂练习:

Python(day.11 魔法方法)_第19张图片
Python(day.11 魔法方法)_第20张图片

此处应注意使用基类super防止进入无限递归;调用后:

Python(day.11 魔法方法)_第21张图片

基类也可以使用_dict_代替:

Python(day.11 魔法方法)_第22张图片

描述符

描述符就是将某种类型的类的实例指派给另一个类的属性。而特殊类型即要实现以下三个或其中一个:
get(self,instance,owner)
用于访问属性,他返回属性的值
set(self,instance,value)
将在属性分配操作中调用,不返回任何内容
delete(self,instance)
控制删除操作,不返回任何内容
Python(day.11 魔法方法)_第23张图片

练习

Python(day.11 魔法方法)_第24张图片

你可能感兴趣的:(python)