[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瀏覽器模擬