python 關於描述符/property偽裝/協程
什麼是描述符
python描述符是一個“繫結行為”的物件屬性,在描述符協議中,它可以透過方法重寫屬性的訪問。這些方法有 get(), set(), 和__delete__()。如果這些方法中的任何一個被定義在一個物件中,那麼這個物件就是一個描述符。
換句話說: 含有以下三個方法之一的物件就是描述符
三個方法(協議):
get(self, instance, owner):呼叫一個屬性時,觸發
set(self, instance, value):為一個屬性賦值時,觸發
delete(self, instance):採用del刪除屬性時,觸發
什麼是self instance、owner?
self 是當前描述符(物件)自身,類似C++this指標, instance 是描述符所屬類物件實體、owner是描述符所在的類(誰擁有這些東西,當然是最高的類)
class Desc(object):
def __get__(self, instance, owner):
print("__get__...")
print("self : \t\t", self)
print("instance : \t", instance)
print("owner : \t", owner)
print('='*40, "\n")
def __set__(self, instance, value):
print('__set__...')
print("self : \t\t", self)
print("instance : \t", instance)
print("value : \t", value)
print('='*40, "\n")
class TestDesc(object):
x = Desc()
#以下為測試程式碼
t = TestDesc()
t.x
#以下為輸出資訊:
__get__...
self : <__main__.Desc object at 0x0000000002B0B828>
instance : <__main__.TestDesc object at 0x0000000002B0BA20>
owner :
========================================
@property把函式呼叫偽裝成對屬性的訪問
class Foo:
@property
def attr(self):
print('getting attr')
return 'attr value'
def bar(self): pass
foo = Foo()
x = property(get, set, del);
容器型別協議:
如果希望定製的容器不可變:只需要定義 len() getitem()這兩個魔法
如果希望定製的容器可變,還需要定義__setitem__ __delitem __()這兩個魔法
class CountList:
def __init__(self, *args):
self.values = [x for x in args]#列表推導式
self.count = {}.fromkeys(range(len(self.values)),0)#建立字典記錄訪問次數
#字典;0 - len(self.value)
def __len__(self):
return len(self.values)
#獲取值, 並不是獲取訪問次數
#gwtitem ,只要訪問 必定觸發, 這就是魔法
def __getitem__(self,key):
self.count[key] +=1
return self.values[key]
python 迭代器: iter next
string = ‘hello, python’
it = iter(string)
next(it)
next(it)
…
iter迭代器為假的時候,丟擲異常
it = iter(“hello,world”)
while True:
try:
each = next(it)
print (each)
except:
break;
迭代器的魔法方法:
iter()
next()
class Iter:
def __init__(self, n =100):
self.a = 0
self.b = 1
self.n = n
def __iter__(self):
return self
def __next__(self):
self.a, self.b = self.b, self.a + self.b
if self.a > self.n: #停止迭代
raise StopIteration
return self.a
生成器 : yeild語句的函式
生成器也是一種迭代器: yield 語句返回
亂入 : 胡進裡,沒規律,嘿嘿
協同程式:協程
所謂協同程式就是可以執行的獨立函式呼叫,函式可以暫停或者掛起,並在需要的時候從程式離開的地方繼續執行
生成器也是一種迭代器,那麼代表它也可以像迭代器一樣, 可以配合next(迭代器物件)使用
仔細觀察: generator 生成器第一次呼叫之後 yield 返回 ,之後並不是從函式頭再開始 ,而是從離開的地方繼續呼叫
def generator(): 鄭州婦科醫院
a = 0
b = 1
print("開始迭代生成器")
while True:
a,b = b, a+b
yield a
for each in generator():
if(each > 100):
break
print(each,end = ' ')#不換行 ,以空格代替換行
生成器推導式作為函式的引數 可以不帶()
eg: 0 + … + 9
本來: sum( (i for i range(10))
和諧掉() sum sum(i for i in range(10))
列表推導式[i for i in range(10)]
字典推導式{i for i in range(100)}
不存在元組推導式哦, 它變成了生成器generator推導式
模組
容器: 對資料的封裝
函式:對語句的封裝
類 : 方法和屬性的封裝
模組: 就是程式。
匯入模組名:
Find1 :
匯入:import +模組名(as t)
呼叫: 模組名(t). + 函式 ·
name == main
if name == main 作用: 讓python識別: 程式是在主程式執行還是在模組內執行: 即讓python識別是私有程式還是公有程式
也就是 if name == main 是主程式嗎? 是的話做什麼, 不是的話做什麼
搜尋路徑
python 匯入模組的過程有一個路徑搜尋的過程
先sys.path.append(“模組路徑”)
再匯入模組
包 package
第一步 建立一個資料夾存放模組 。檔案見名字就是包的名字
第二步 在資料夾內建立一個__init__.py 的模組檔案,內容可以為空
第三步 將相關的模組放在資料夾(包)裡面
匯入 : 包名.模組名
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2689845/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關於協程的理解
- 關於PHP協程與阻塞的思考PHP
- 關於引用(python中的偽指標)的理解Python指標
- python 協程Python
- Python協程Python
- 關於Oracle偽列rownumOracle
- 課時46:魔法方法:描述符(property的原理)
- 基於bs4+requests的python爬蟲偽裝Python爬蟲
- Python裝飾器之property()詳解Python
- python 協程與go協程的區別PythonGo
- Python協程與JavaScript協程的對比PythonJavaScript
- Python的協程Python
- python中協程Python
- python 如何偽裝郵箱Python
- Python協程詳解Python
- Python中的協程Python
- 基於協程的Python網路庫gevent介紹Python
- Python黑魔法之property裝飾器詳解Python
- 理解Python的協程(Coroutine)Python
- python進階(17)協程Python
- python中gevent協程庫Python
- python進階(25)協程Python
- 關於WebSocket協議Web協議
- python 描述符解析Python
- YYModel 原始碼歷險記:關於ivar,method,property原始碼
- 關於ubuntu安裝中過程遇到問題Ubuntu
- Python @property 詳解Python
- Python的黑魔法@property裝飾器的使用技巧Python
- 關於檔案描述符的close-on-exec標誌位
- python 協程用法總結(一)Python
- python之協程的那些事Python
- python協程asyncio的個人理解Python
- Python協程greenlet實現原理Python
- Python中協程(coroutine)詳解Python
- python 協程 自定義互斥鎖Python
- 程式執行緒協程關係執行緒
- 關於TLS/SSL協議TLS協議
- git 關於多人協作Git