pythoth 中常用的魔法方法
Python魔法方法(magic method),顾名思义,魔法总是带有一些神奇色彩,就跟魔术似的。它也是有自己的规律,在这里或者说规则更合适一些。
魔法方法有一个非常鲜明的特征,就是总是被双下划线所包围,之所以称之为魔法方法,是由于其不是由程序员去手动的调用,而是在一定场景下自动触发,有python解释器自动调用。
①__new__(cls[, …])方法
-
new 是在对象实例化时触发,负责为对象分配内存空间
-
它的第一个参数是这个类,其他的参数是用来直接传递给 init 方法
-
new 决定是否要使用该 init 方法,因为 new 可以调用其他类的构造方法或者直接返回别的实例对象来作为本类的实例,如果 new没有返回实例对象,则 init 不会被调用
-
new 主要是用于继承一个不可变的类型比如一个 tuple 或者 string__init__(self[, …])
构造器,当一个实例被创建的时候调用的初始化方法class Mymethod(): def __new__(cls, *args, **kwargs): return super().__new__(cls) # return object.__new__(cls)
②__init__(self,[…])
类的初始化方法。当一个实例被创建的时候调用的初始化方法它获取任何传给构造器的参数(比如我们调用 m = Mymethod(“张三”) , init 就会接到参数
def __init__(self,name):
self.name = name
③__str__(self)
当打印对象的时候回python解释器回默认调用__str__方法,默认不配置,打印对象的地址,当在类中自定义__str__方法时,打印对象就会打印出指定的内容(类型一定要是字符串str)
def __str__(self):
return 'name:{}'.format(self.name)
④__repr__(self)
__str__方法的“备胎”,在没有__str__方法的情况下,用__repr__也可实现打印对象输出指定内容,当__str__和__repr__同时存在是,默认__str__方法
也可手动打印指定方法的内容:
m = Mymethod('张三')
print('%s'%m)
print('%r'%m)
def __repr__(self):
return 'name:{}'.format(self.name)
⑤__call__(self)
将对象当方法来调用时,默认会报错 对象()或类()()
定义__call__方法可以让一个对象当函数来调用
def __call__(self, *args, **kwargs):
return self.name
⑥__del__(self)
当一个实例化对象被销毁的时候调用该对象
手动调用del函数时,__del__会被触发
生命周期结束时,对象被系统回收时,__del__会被执行
局部:方法调用结束,触发__del__方法
全局:程序结束,触发 __del__方法
def __del__(self):
print('{}:回收前再让说一下临终遗言!'.format(self))
⑦__hash__(self)
执行hash()函数时会调用该方法
set集合底层数据结构就是采用哈希表
我们其实可以手动指定底层采用哪些属性来计算哈希值,再此不做详述
⑧__eq__(self)
来用指定用哪些属性做比较,一般都是引用分类的方法
很少需要手动指定
“==”的本质就是调用对象的__eq__方法进行比较
⑨__add__(self)
可以实现对象的相加操作