[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方法就可以了
- 基础部分
- 基础知识
- 变量
- 数据类型
- 数字与布尔详解
- 列表详解list
- 字符串详解str
- 元组详解tup
- 字典详解dict
- 集合详解set
- 运算符
- 流程控制与循环
- 字符编码
- 编的小程序
- 三级菜单
- 斐波那契数列
- 汉诺塔
- 文件操作
- 函数相关
- 函数基础知识
- 函数进阶知识
- lambda与map-filter-reduce
- 装饰器知识
- 生成器和迭代器
- 琢磨的小技巧
- 通过operator函数将字符串转换回运算符
- 目录规范
- 异常处理
- 常用模块
- 模块和包相关概念
- 绝对导入&相对导入
- pip使用第三方源
- time&datetime模块
- random随机数模块
- os 系统交互模块
- sys系统模块
- shutil复制&打包模块
- json&pickle&shelve模块
- xml序列化模块
- configparser配置模块
- hashlib哈希模块
- subprocess命令模块
- 日志logging模块基础
- 日志logging模块进阶
- 日志重复输出问题
- re正则表达式模块
- struct字节处理模块
- abc抽象类与多态模块
- requests与urllib网络访问模块
- 参数控制模块1-optparse-过时
- 参数控制模块2-argparse
- pymysql数据库模块
- requests网络请求模块
- 面向对象
- 面向对象相关概念
- 类与对象基础操作
- 继承-派生和组合
- 抽象类与接口
- 多态与鸭子类型
- 封装-隐藏与扩展性
- 绑定方法与非绑定方法
- 反射-字符串映射属性
- 类相关内置方法
- 元类自定义及单例模式
- 面向对象的软件开发
- 网络-并发编程
- 网络编程SOCKET
- socket简介和入门
- socket代码实例
- 粘包及粘包解决办法
- 基于UDP协议的socket
- 文件传输程序实战
- socketserver并发模块
- 多进程multiprocessing模块
- 进程理论知识
- 多进程与守护进程
- 锁-信号量-事件
- 队列与生产消费模型
- 进程池Pool
- 多线程threading模块
- 进程理论和GIL锁
- 死锁与递归锁
- 多线程与守护线程
- 定时器-条件-队列
- 线程池与进程池(新方法)
- 协程与IO模型
- 协程理论知识
- gevent与greenlet模块
- 5种网络IO模型
- 非阻塞与多路复用IO实现
- 带着目标学python
- Pycharm基本使用
- 爬虫
- 案例-爬mzitu美女
- 案例-爬小说
- beautifulsoup解析模块
- etree中的xpath解析模块
- 反爬对抗-普通验证码
- 反爬对抗-session登录
- 反爬对抗-代理池
- 爬虫技巧-线程池
- 爬虫对抗-图片懒加载
- selenium浏览器模拟