您好,登錄后才能下訂單哦!
這篇文章主要介紹“python描述符的簡單介紹”,在日常操作中,相信很多人在python描述符的簡單介紹問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”python描述符的簡單介紹”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
什么是描述符
python描述符是一個“綁定行為”的對象屬性,在描述符協(xié)議中,它可以通過方法重寫屬性的訪問。這些方法有 get(), set(), 和__delete__()。如果這些方法中的任何一個被定義在一個對象中,那么這個對象就是一個描述符。
換句話說: 含有以下三個方法之一的對象就是描述符
三個方法(協(xié)議):
get(self, instance, owner):調(diào)用一個屬性時,觸發(fā)
set(self, instance, value):為一個屬性賦值時,觸發(fā)
delete(self, instance):采用del刪除屬性時,觸發(fā)
什么是self instance、owner?
self 是當(dāng)前描述符(對象)自身,類似C++this指針, instance 是描述符所屬類對象實體、owner是描述符所在的類(誰擁有這些東西,當(dāng)然是最高的類)
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把函數(shù)調(diào)用偽裝成對屬性的訪問
class Foo:
@property
def attr(self):
print('getting attr')
return 'attr value'
def bar(self): pass
foo = Foo()
x = property(get, set, del);
容器類型協(xié)議:
如果希望定制的容器不可變:只需要定義 len() getitem()這兩個魔法
如果希望定制的容器可變,還需要定義__setitem__ __delitem __()這兩個魔法
class CountList:
def __init__(self, *args):
self.values = [x for x in args]#列表推導(dǎo)式
self.count = {}.fromkeys(range(len(self.values)),0)#建立字典記錄訪問次數(shù)
#字典;0 - len(self.value)
def __len__(self):
return len(self.values)
#獲取值, 并不是獲取訪問次數(shù)
#gwtitem ,只要訪問 必定觸發(fā), 這就是魔法
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語句的函數(shù)
生成器也是一種迭代器: yield 語句返回
亂入 : 胡進(jìn)里,沒規(guī)律,嘿嘿
協(xié)同程序:協(xié)程
所謂協(xié)同程序就是可以運行的獨立函數(shù)調(diào)用,函數(shù)可以暫?;蛘邟炱?,并在需要的時候從程序離開的地方繼續(xù)執(zhí)行
生成器也是一種迭代器,那么代表它也可以像迭代器一樣, 可以配合next(迭代器對象)使用
仔細(xì)觀察: generator 生成器第一次調(diào)用之后 yield 返回 ,之后并不是從函數(shù)頭再開始 ,而是從離開的地方繼續(xù)調(diào)用
def generator():鄭州婦科醫(yī)院 http://www.xadsyyfk.com/
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 = ' ')#不換行 ,以空格代替換行
生成器推導(dǎo)式作為函數(shù)的參數(shù) 可以不帶()
eg: 0 + … + 9
本來: sum( (i for i range(10))
和諧掉() sum sum(i for i in range(10))
列表推導(dǎo)式[i for i in range(10)]
字典推導(dǎo)式{i for i in range(100)}
不存在元組推導(dǎo)式哦, 它變成了生成器generator推導(dǎo)式
模塊
容器: 對數(shù)據(jù)的封裝
函數(shù):對語句的封裝
類 : 方法和屬性的封裝
模塊: 就是程序。
導(dǎo)入模塊名:
Find1 :
導(dǎo)入:import +模塊名(as t)
調(diào)用: 模塊名(t). + 函數(shù) ·
name == main
if name == main 作用: 讓python識別: 程序是在主程序運行還是在模塊內(nèi)運行: 即讓python識別是私有程序還是公有程序
也就是 if name == main 是主程序嗎? 是的話做什么, 不是的話做什么
搜索路徑
python 導(dǎo)入模塊的過程有一個路徑搜索的過程
先sys.path.append(“模塊路徑”)
再導(dǎo)入模塊
包 package
第一步 創(chuàng)建一個文件夾存放模塊 。文件見名字就是包的名字
第二步 在文件夾內(nèi)創(chuàng)建一個__init__.py 的模塊文件,內(nèi)容可以為空
第三步 將相關(guān)的模塊放在文件夾(包)里面
導(dǎo)入 : 包名.模塊名
到此,關(guān)于“python描述符的簡單介紹”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。