初始化方法__init__

触发机制:实例化对象之后立即触发
参数:至少有一个self,接收当前对象,其他参数根据需要进行定义
返回值:无
作用:初始化对象的成员

构造方法__new__

触发时机: 实例化对象时自动触发(在__init__之前触发)
参数:至少一个cls 接收当前类,其他参数根据初始化方法参数决定
返回值:必须返回一个对象实例,没有返回值,则实例化对象的结果为None
作用:实例化对象
注意:实例化对象是Object类底层实现,其他类继承了Object的__new__才能够实现实例化对象。

析构方法__del__

触发时机:当该类对象被销毁时,自动触发
参数:一个self,接受当前对象
返回值:无
作用:关闭或释放对象创建时资源
注意:del不一定会触发当前方法,只有当前对象没有任何变量引用时才会触发

call

调用对象的魔术方法
触发时机:将对象当作函数调用时触发,方式: 对象()
参数:至少一个self接收对象,其余根据调用时参数决定
返回值:根据情况而定
作用:可以将复杂的步骤进行合并操作,减少调用的步骤,方便使用
注意:无

len

触发时机:使用len(对象) 的时候触发
参数:一个参数self
返回值:必须是一个整型
作用:可以设置为检测对象成员个数,但是也可以进行其他任意操作
注意:返回值必须必须是整数,否则语法报错,另外该要求是格式要求。

str

触发时机:使用print(对象)或者str(对象)的时候触发
参数:一个self接收对象
返回值:必须是字符串类型
作用:print(对象时)进行操作,得到字符串,通常用于快捷操作
注意:无

repr

触发时机:在使用repr(对象)的时候触发
参数:一个self接收对象
返回值:必须是字符串
作用:将对象转使用repr化为字符串时使用,也可以用于快捷操作

bool

触发时机: 使用bool(对象)的时候触发
参数:一个self接收对象
返回值:必须是布尔值
作用:根据实际情况决定,可以作为快捷方式使用
注意:仅适合于返回布尔值的操作

format

触发时机:使用字符串.format(对象)时候触发
参数:一个self接收对象,一个参数接收format的{}中的格式,例如:>5
返回值:必须是字符串
作用:设置对象可以作为format的参数,并且自定义对象格式化的规则
注意:无

比较运算相关魔术方法

  1. __ lt__(self, other):
    定义小于号的行为:x < y 调用 x.lt(y)
  2. __ le__(self, other):
    定义小于等于号的行为:x <= y 调用 x.le(y)
  3. __ eq__(self, other) :
    定义等于号的行为:x == y 调用 x.eq(y)
  4. __ ne__(self, other):
    定义不等号的行为:x != y 调用 x.ne(y)
  5. __ gt__(self, other):
    定义大于号的行为:x > y 调用 x.**gt(y)
  6. __ ge__(self, other) :
    定义大于等于号的行为:x >= y 调用 x.ge(y)

算术运算相关魔术方法

  1. add(self, other) 定义加法的行为:+
  2. sub(self, other) 定义减法的行为:-
  3. mul(self, other) 定义乘法的行为:*
  4. truediv(self, other) 定义真除法的行为:/
  5. floordiv(self, other) 定义整数除法的行为://
  6. mod(self, other) 定义取模算法的行为:%
  7. divmod(self, other) 定义当被 divmod() 调用时的行为
  8. pow(self, other[, modulo]) 定义当被 power() 调用或 ** 运算时的行为
  9. lshift(self, other) 定义按位左移位的行为:<<
  10. rshift(self, other) 定义按位右移位的行为:>>
  11. and(self, other) 定义按位与操作的行为:&
  12. xor(self, other) 定义按位异或操作的行为:^
  13. or(self, other) 定义按位或操作的行为:|

赋值运算相关魔术方法

  1. iadd(self, other) 定义赋值加法的行为:+=
  2. isub(self, other) 定义赋值减法的行为:-=
  3. imul(self, other) 定义赋值乘法的行为:=
  4. itruediv(self, other) 定义赋值真除法的行为:/=
  5. ifloordiv(self, other) 定义赋值整数除法的行为://=
  6. imod(self, other) 定义赋值取模算法的行为:%=
  7. ipow(self, other[, modulo]) 定义赋值幂运算的行为:**=
  8. ilshift(self, other) 定义赋值按位左移位的行为:<<=
  9. irshift(self, other) 定义赋值按位右移位的行为:>>=
  10. iand(self, other) 定义赋值按位与操作的行为:&=
  11. ixor(self, other) 定义赋值按位异或操作的行为:^=
  12. ior(self, other) 定义赋值按位或操作的行为:|=

一元运算相关魔术方法

  1. pos(self) 定义正号的行为:+x
  2. neg(self) 定义负号的行为:-x
  3. abs(self) 定义当被 abs() 调用时的行为
  4. invert(self) 定义按位求反的行为:~x

类型转换相关魔术方法

  1. complex(self) 定义当被 complex() 调用时的行为(需要返回恰当的值)
  2. int(self) 定义当被 int() 调用时的行为(需要返回恰当的值)
  3. float(self) 定义当被 float() 调用时的行为(需要返回恰当的值)
  4. round(self[, n]) 定义当被 round() 调用时的行为(需要返回恰当的值)
  5. index(self)
  • 当对象是被应用在切片表达式中时,实现整形强制转换
  • 如果你定义了一个可能在切片时用到的定制的数值型,你应该定义 index
  • 如果 index 被定义,则 int 也需要被定义,且返回相同的值

上下文管理相关魔术方法(with)

enter(self)

1. 定义当使用 with 语句时的初始化行为
2. enter 的返回值被 with 语句的目标或者 as 后的名字绑定

exit(self, exctype, excvalue, traceback)

1. 定义当一个代码块被执行或者终止后上下文管理器应该做什么
2. 一般被用来处理异常,清除工作或者做一些代码块执行完毕之后的日常工作

 

容器类型相关魔术方法

  1. len(self) 定义当被 len() 调用时的行为(返回容器中元素的个数)
  2. getitem(self, key) 定义获取容器中指定元素的行为,相当于 self[key]
  3. setitem(self, key, value) 定义设置容器中指定元素的行为,相当于 self[key] = value
  4. delitem(self, key) 定义删除容器中指定元素的行为,相当于 del self[key]
  5. iter(self) 定义当迭代容器中的元素的行为
  6. reversed(self) 定义当被 reversed() 调用时的行为
  7. contains(self, item) 定义当使用成员测试运算符(in 或 not in)时的行为

魔术方法示例

initnew、__del__的应用

class People(object):
    # 创建对象
    def __new__(cls, *args, **kwargs):
        print("触发了构造方法")
        ret = super().__new__(cls) # 调用父类的__new__()方法创建对象
        return ret ## 将对象返回
    # 实例化对象
    def __init__(self, name, age):
        self.name = name
        self.age = age
        print("初始化方法")
    #  删除对象
    #   del 对象名或者程序执行结束之后
    def __del__(self):
        print("析构方法,删除对象")


if __name__ == '__main__':
    p1 = People('xiaoming', 16)

 

输出:
触发了构造方法
初始化方法
析构方法,删除对象

使用__call__方法实现斐波那契数列

斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13
特别指出:第0项是0,第1项是第一个1。从第三项开始,每一项都等于前两项之和。

class Fib(object):
    def __init__(self):
        pass
    def __call__(self,num):
        a,b = 0,1;
        self.l=[]

        for i in range (num):
            self.l.append(a)
            a,b= b,a+b
        return self.l
    def __str__(self):
        return str(self.l)
    __rept__=__str__

f = Fib()
print(f(10))

输出:
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]