🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] [参考链接](http://www.cnblogs.com/linhaifeng/articles/6204014.html) 首先需要知道,`__xx__`这种以`__`开头并以`__`结尾的方法,会在(满足条件)某种情况下由python自动执行的方法. ## isinstance和issubclass **isinstance(obj,cls) 检查obj是否是类 cls 的对象** ~~~ class Foo(object): pass obj = Foo() isinstance(obj, Foo) ~~~ **issubclass(sub, super) 检查sub类是否是 super 类的派生类** ~~~ class Foo(object): pass class Bar(Foo): pass issubclass(Bar, Foo) ~~~ ## `__item__`字典系列 item系列方法,是将对象模拟为字典来使用,即将原来的obj.name的调用方式,改为obj['name'] getitme用于获取对象属性,setitem用于设置对象属性,delitem用于删除对象属性 * __getitem__:字典方式获取属性 ``` class foo: def __init__(self,name): self.name=name def __getitem__(self, item): return self.__dict__.get(item) obj=foo('noah') print(obj.__dict__) #结果:{'name': 'noah'} print(obj.name) #结果:noah print(obj['name']) #结果:noah ``` * __setitem__:字典方式设置属性 ~~~ class foo: def __init__(self,name): self.name=name def __setitem__(self, key, value): self.__dict__[key]=value obj=foo('noah') obj['name']='luogang' print(obj.__dict__) #结果:{'name': 'luogang'} ~~~ * __delitem__:字典方式删除属性 ~~~ class foo: def __init__(self,name): self.name=name def __delitem__(self, key): del self.__dict__[key] obj=foo('noah') del obj['name'] print(obj.__dict__) #结果:{} ~~~ * 三个方法一起使用 ``` class Foo: def __init__(self,name): self.name=name def __getitem__(self, item): #item='namexxx' return self.__dict__.get(item) def __setitem__(self, key, value): self.__dict__[key]=value def __delitem__(self, key): del self.__dict__[key] obj=Foo('noah') print(obj.__dict__) ``` ## `__str__`打印提示方法: `__str__`方法会在执行打印的时候执行,并返回一个字符串数据 正常情况下,打印一个自定义的类的实例化对象,会显示该对象的内存地址. 而dict这类自带的类的实例化对象,打印的时候,是打印字典对象中的数据,区别如下: ~~~ class foo: name='noah' A=foo() print(A) #结果:<__main__.foo object at 0x00000184B5399748> B=dict({'name':'noah'}) print(B) #结果:{'name': 'noah'} ~~~ 自定义类的对象的打印结果,给不了任何有用的信息,如果想像dict一样打印有用的提示信息,就需要用到`__str__` ``` class People: def __init__(self,name,age): self.name=name self.age=age def __str__(self): return '<name:%s,age:%s>' %(self.name,self.age) obj=People('egon',18) print(obj) #相当于执行print(obj.__str__()) #结果: <name:egon,age:18> ``` ## `__del__`资源回收方法 在对象被删除的时候会先自动执行此方法,然后再删除对象,可以用来回收和对象相关的系统资源 例如`f=open('settings.py')`命令: 此做了两个操作,一是定义了python变量`f`,二是请求操作系统打开了文件`settings.py`,当程序运行结束时,python定义的变量会自动回收,但操作系统打开的文件却没有回收,所以需要执行`f.close()`方法关闭文件 方法打开文件,后,如果出现运行完成,python会自动` ``` class Open: def __init__(self,filename): print('open file.......') self.filename=filename def __del__(self): print('回收操作系统资源:self.close()') f=Open('settings.py') print('----main------') #程序运行结束后自动执行del f.__del__() #运行结果: open file....... ----main------ 回收操作系统资源:self.close() ``` ## `__call__方法` call方法可以使实例化的对象能被调用,也就是对象在被点用时执行call方法 默认情况下,实例化好的对象是不能被调用的,如下 ~~~ class Foo: pass obj=Foo() obj() #输出:TypeError: 'people' object is not callable ~~~ 如果想让obj能再次被调用,就需要添加call方法,如下 ~~~ class Foo: pass def __call__(self, *args, **kwargs): print(self) print(args) print(kwargs) obj=Foo() obj('noah','luo',age=1,sex=2) #输出: <__main__.Foo object at 0x0000016DFF81A6A0> ('noah', 'luo') {'age': 1, 'sex': 2} ~~~ 具体调用obj时想要达到什么效果,就修改call方法就可以了