python高階第四天

2021-10-07 15:54:38 字數 2776 閱讀 1497

屬性描述符是實現了特定協議的類,只要實現了__get__,__set__和__delete__三個方法中的任意乙個,這個類就是描述符,它能實現對多個屬性運用相同訪問邏輯的一種方式,通俗來說就是:建立乙個例項,作為另乙個類的類屬性。

除了使用類當作乙個屬性描述符,我們之前學習的 property(),就是可以輕鬆地為任意屬性建立可用的描述符。建立 property() 的語法是 property(fget=none, fset=none, fdel=none, doc=none)

描述符查詢順序

• 當為資料描述符時,get__優先順序高於__dict

• 當為非資料描述符時,dict__優先順序高於__get

就是建立類的類

# 定義魔法方法

def __init__(self, name):

self.name = name

# 新增例項方法 slef

def info(self):

return self.age

# 新增靜態方法 無需self 與 cls 引數

@staticmethod

def stat_func():

print("i am staticmethod")

# 新增類方法 注意一定有cls引數

@classmethod

def cls_method(cls):

print("classmethod")

user = type("user", (), )

# print(user) # zs = user("c") # 例項化

# print(zs) # <__main__.user object at 0x000002b6086be860>

print(zs.age) # 類屬性

print(zs.name) # 例項屬性

zs_age = zs.info() # 訪問 例項方法

print(zs_age)

zs.stat_func() # 訪問靜態方法

type也可以繼承

class baseclass(object):

def test(self):

return "baseclass test"

def test1(self):

return "baseclass test1"

class baseclass2(object):

def test(self):

return "baseclass2 test"

user = type("user",(baseclass2, baseclass),) # 元組必須打逗號 否則報錯

oy = user()

print(oy.test()) # 訪問父類的test方法

print(oy.test1())

# 2.建立upper_attr函式

def upper_attr(cls_name, cls_parents, cls_attr):

# print(cls_name) # myclass,當前指定的類名

# print(cls_parents) # (,)

# print(cls_attr) #

"""4.將屬性名規定為大寫訪問

- 遍歷取出屬性

- 如果屬性是非_開頭的

- 將其轉為大寫

"""new_attr = {}

for name, value in cls_attr.items():

# print(name)

# print(value)

if not name.startswith("_"): #判斷是否以下劃線開頭

new_attr[name.upper()] = value.upper()

# 5.返回type建立的類

return type(cls_name, cls_parents, new_attr)

# # 3.返回type建立的類

# return type(cls_name, cls_parents, cls_attr)

# 1.建立myclass類,指定metaclass=upper_attr

class myclass(object, metaclass=upper_attr):

name = "ls"

mc = myclass()

print(mc.name)

指乙個重複的過程,每一次重複都是基於上一次結果而來,迭代提供了一種通用的不依賴索引的迭代取值方式

可迭代物件不一定是迭代器

為什麼要有生成器

列表所有資料都在記憶體中,如果有海量資料的話會非常消耗記憶體。

比如說:我們僅僅需要訪問前面幾個元素,但後面絕大多元素占用的記憶體就會浪費了。

那麼生成器就是在迴圈的過程中根據演算法不斷推算出後續的元素,這樣就不用建立整個完整的列表,從而節省大量的空間。

總而言之,就是當我們想要使用龐大資料,又想讓它占用的空間少,那就使用生成器。

當乙個函式中包含yield關鍵字,那麼這個函式就不再是乙個普通的函式,而是乙個generator。

注意:• yield返回乙個值,並且記住這個返回值的位置,下次遇到next()呼叫時,**從yield的下一條語句開始執行。與return的差別是,return也是返回乙個值,但是直接結束函式。

學習python 第四天

python 迴圈結構 迴圈結構可以輕鬆的控制某件事重複 再重複的發生。在python中構造迴圈結構有兩種做法,一種是for in迴圈,一種是while迴圈。for in迴圈 如果明確的知道迴圈執行的次數或者是要對乙個容器進行迭代 後面會講到 那麼我們推薦使用for in迴圈 用for迴圈實現1 1...

Python學習 第四天

map函式可以對序列中個每個值進行某種批量轉化操作,然後將結果作為迭代器iterator返回,迭代器可以利用for迴圈或者next 函式來訪問每個值。map函式接收兩個引數,乙個是函式f,乙個是iterator,map在iterable的每個元素上依次執行函式f,並把結果作為新的iterator迭代...

學習python,第四天

echo 內容 a 將內容放到檔案裡 ls lh a 會覆蓋原有內容 echo a 追加到末尾 不會覆蓋原有內容 管道 ls lha more shutdown關機 shutdown now立刻關機 shutdown r重啟 shutdown c取消 shutdown 10 00十點關機 shutd...