魔法方法
1 _ _call_ _()
""" 那些可以加()来调用执行的对象,实际是执行了_ _call_ _()方法 """ # 案例1 class Student: school = 'SH' # def __call__(self, *args, **kwargs): # print(f'diao yong le __call__()') stu1 = Student() print(callable(stu1)) # 案例2 def test(): print('I am test') test() # I am test test.__call__() # I am test
2 _ _str_ _()
print对象时自动触发,将字符串类型值作为本次结果输出
# 无__str__()方法时, 打印对象后得到的是对象的内存地址 class Student: school = 'SH' stu = Student() print(stu) # <__main__.Student object at 0x000001204D266D68> # 有__str__()方法时, 打印对象得到的是对象调用__str__()后的返回值 class Student1: school = 'SH' def __str__(self): return 'I am Student2' stu1 = Student1() print(stu1) # I am Student2
3 _ _del_ _()
代码读到 <del 对象> 或者 程序结束释放内存前触发_ _del_ _()执行
/告诉操作信息: 删除对象之前占用的相关资源,如打开了文件或建立的网络链接/
4 _ _new_ _() _ _init_ _()
# _ _new_ _()用于创建对象并返回对象;__init__()用于初始化对象 class Student1(object): school = 'SH' def __new__(cls, *args, **kwargs): print(f'new~') ins = object.__new__(cls) return ins def __init__(self): print(f'init~~') pass Student1() """ new~ init~~ """
5 _ _enter_ _() _ _exit_ _()
对象进入或离开某范围要做的特定操作, 比如分配或释放内存、文件操作、网络连接、数据库连接、使用锁的场景; 语法格式是with ... as ../进入with代码块调用类的__enter__方法,离开with代码块调用类的__exit__方法/
数据库应用场景具体: enter方法内建立/拿数据库链接,然后进行数据操作,最后退出时候断开/放回数据库链接.
class Test: def __enter__(self): print('enter~') return self def __exit__(self, exc_type, exc_val, exc_tb): print('exit~') def math(self): print(f'math~') with Test() as test: test.math() """ enter~ math~ exit~ """
6 _ _setitem_ _() _ _getitem_ _()
可以实现 对象[key] = value , 对象中括号往里放值; 以及对象中括号来取值
class Foo: def __setitem__(self, key, value): self.__dict__[key] = value def __getitem__(self, item): print(self.__dict__[item]) f = Foo() f['name'] = 'lll' print(f['name'])
所以: 以后在遇到对象中括号取值或赋值时,要想到它要么是继承了dict要么是重写了 _ _setitem_ _() _ _getitem_ _() 方法
7 _ _setattr_ _() _ _getattr_ _()
# 实现字典可以用点的方法取值设定值 class MyDict(dict): # 对象.属性时, 若属性存在,则修改属性值;若不存在,则给对象添加一个该属性 def __setattr__(self, key, value): self[key] = value # 对象.属性时,若属性不存在,则自动调用__getattr__方法(至于里面内容怎么写,自己写啥就是啥) def __getattr__(self, item): return self.get(item) d1 = {'name': 'json'} d = MyDict(d1) print(d.name) # json
理解参考: python __getattribute__、__getattr__、__setattr__详解 - 漫漫芜 - 博客园 (cnblogs.com)
8 _ _iter_ _() _ _next_ _()
待补充code