27 python中的魔法方法
python中的魔法方法
1 __init__:类实例化会触发
2 __str__:打印对象会触发
3 __call__:对象()触发,类也是对象 类(),类的实例化过程调用元类的__call__
4__new__:在类实例化会触发,它比__init__早(造出裸体的人,__init__穿衣服)
5 __del__:del 对象,对象回收的时候触发
6__setattr__,__getattr__:(.拦截方法),当对象.属性--》赋值会调用setattr,如果是取值会调用getattr
7__getitem__,__setitem__:([]拦截)
8__enter__和__exit__ 上下文管理器
9 __eq__两个对象比较
- str函数或者print函数—>obj.str()
- repr或者交互式解释器—>obj.repr()
- 如果str没有被定义,那么就会使用repr来代替输出
- 注意:这俩方法的返回值必须是字符串,否则抛出异常
案例1:写一个类,有个name属性,如果name赋值为非字符串,就不让放
class Person: def __int__(self): self.name = 'dzg' def __setattr__(self, key, value): if isinstance(value,str): self.__dict__[key]=value else: raise TypeError('必须是str类型') p1 = Person() p1.age = 66
案例2 :__setitem__: [] 拦截
class Person: def __int__(self): self.name = 'dzg' def __setitem__(self, key, value): setattr(self,key,value) p1 = Person() p1['age'] = 66 print(p1.__dict__)
案例3 :__getitem__: [] 拦截
class Person: def __int__(self): self.name = 'dzg' def __setitem__(self, key, value): setattr(self,key,value) def __getitem__(self, item): return getattr(self,item) p1 = Person() p1['age'] = 66 print(p1['age'])
案例4 :with 上下文管理器
class Person: def __enter__(self): print("我在with管理的时候,会触发") print('进入with语句块时执行此方法,此方法如果有返回值会赋值给as声明的变量') return 'oo' def __exit__(self, exc_type, exc_val, exc_tb): print('退出with代码块时执行此方法') print('1', exc_type) print('2', exc_val) print('3', exc_tb) with Person() as p: # 这句话执行,会触发类的__enter__ print(p)
案例4 : __eq__
当执行==时,会触发__eq__的执行,并且把b传进去,就是object
==后只要是对象,就可以传进去,就是object
class A: def __init__(self, x, y): self.x = x self.y = y def __eq__(self,obj): # 打印出比较的第二个对象的x值 print(obj.x) if self.x +self.y == obj.x+obj.y: return True else: return False a = A(1, 2) b = A(99, 3) print(a == b)
案例5:通过上下文管理器写一个mysql的连接,通过with管理
import pymysql class Mysql(): def __enter__(self): self.conn = pymysql.connect( host='localhost', port=3306, user='root', password='123', database='db1', charset='utf8' # 编码千万不要加- ) return self.conn def __exit__(self, exc_type, exc_val, exc_tb): self.conn.close() with Mysql() as mysql: cursor = mysql.cursor() sql = 'select * from test;' res = cursor.execute(sql) print(cursor.fetchone())