屬性描述符是實現了特定協議的類,只要實現了__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...