python多型 >>>思維導圖》
多型概念:一種事物具備多種 不同的形態
例如:水「固態」、「液態」、「氣態」
官方解釋:多個不同類的物件可以響應同乙個方法,產生不同的結果
首先強調多型不是一種特殊的語法,而是一種狀態、特性(即多個不同物件可以響應同乙個方法,產生不同結果)
好處:對於使用者而言,大大的降低了使用難度
實現多型:介面、抽象類、鴨子型別都可以寫出具備多型的**,最簡單的就是鴨子型別
案例要管理 雞 鴨 鵝
如何能夠最方便的 管理,就是我說同一句話,他們都能理解
既它們擁有相同的方法
class ji:
def bark(self):
print("哥哥哥")
def spawn(self):
print("下雞蛋..")
class duck:
def bark(self):
print("嘎嘎嘎")
def spawn(self):
print("下鴨蛋")
class e:
def bark(self):
print("餓餓餓....")
def spawn(self):
print("下鵝蛋..")
j = ji()
y = duck()
e = e()
def mange(obj):
obj.spawn()
mange(j)
mange(y)
mange(e)
# python中到處都有多型
a = 10
b = "10"
c = [10]
print(type(a))
print(type(b))
print(type(c))
isinstance
判斷乙個物件是否是某個類的例項
引數1 要判斷的物件
引數2 要判斷的型別
issubclass
判斷乙個類是否是另乙個類的自雷
引數1 子類
引數2 父類
魔法函式
str__str__ 會在物件被轉換為字串時,轉換的結果就是這個函式的返回值
使用場景:我們可以利用該函式來自定義,物件的是列印格式
del執行時機: 手動刪除物件時立馬執行,或是程式執行結束時也會自動執行
使用場景:當你的物件在使用過程中,開啟了不屬於直譯器的資源:例如檔案,網路埠# del使用案例
class filetool:
"""該類用於簡化檔案的讀寫操作 """
def __init__(self,path):
self.file = open(path,"rt",encoding="utf-8")
self.a = 100
def read(self):
return self.file.read()
# 在這裡可以確定乙個事,這個物件肯定不使用了 所以可以放心的關閉問檔案了
def __del__(self):
self.file.close()
tool = filetool("a.txt")
print(tool.read())
call
執行時機:在呼叫物件時自動執行,(既物件加括號)
測試#call 的執行時機
class a:
def __call__(self, *args, **kwargs):
print("call run")
print(args)
print(kwargs)
a = a()
a(1,a=100)
slots
該屬性是乙個類屬性,用於優化物件記憶體占用
優化的原理將原本不固定的屬性數量,變得固定了這樣的直譯器就不會為這個物件建立命名空間,所以__dict__也沒了 從而達到減少記憶體開銷的效果
另外當類**現了slots時將導致這個類的物件無法在新增新的屬性
案例# slots的使用
class person:
__slots__ = ["name"]
def __init__(self,name):
self.name = name
p = person("jck")
# 檢視記憶體占用
# print(sys.getsizeof(p))
# p.age = 20 # 無法新增
# dict 沒有了
print(p.__dict__)
點語法的實現
getattr setattr delattrgetattr 用點訪問屬性的時如果屬性不存在時執行
setattr 用點設定屬性時
delattr 用del 物件.屬性 刪除屬性時 執行
這幾個函式反映了 python直譯器是如何實現 用點來訪問屬性
getattribute 該函式也是用來獲取屬性
在獲取屬性時如果存在getattribute則先執行該函式,如果沒有拿到屬性則繼續呼叫 getattr函式,如果拿到了則直接返回
取值的實現
getitem setitem delitem任何的符號 都會被直譯器解釋成特殊含義 ,例如 . ()
getitem 當你用中括號去獲取屬性時 執行
setitem 當你用中括號去設定屬性時 執行
delitem 當你用中括號去刪除屬性時 執行
運算子過載
當我們在使用某個符號時,python直譯器都會為這個符號定義乙個含義,同時呼叫對應的處理函式, 當我們需要自定義物件的比較規則時,就可在子類中覆蓋 大於 等於 等一系列方法....
案例:原本自定義物件無法直接使用大於小於來進行比較 ,我們可自定義運算子來實現,讓自定義物件也支援比較運算子class student(object):
def __init__(self,name,height,age):
self.name = name
self.height = height
self.age = age
def __gt__(self, other):
# print(self)
# print(other)
# print("__gt__")
return self.height > other.height
def __lt__(self, other):
return self.height
def __eq__(self, other):
if self.name == other.name and self.age == other.age and self.height == other.height:
return true
return false
stu1 = student("jack",180,28)
stu2 = student("jack",180,28)
# print(stu1
print(stu1 == stu2)
上述**中,other指的是另乙個參與比較的物件,
大於和小於只要實現乙個即可,符號如果不同 直譯器會自動交換兩個物件的位置
迭代器協議
迭代器是指具有__iter__和__next__的物件
我們可以為物件增加這兩個方法來讓物件變成乙個迭代器
案例class myrange:
def __init__(self,start,end,step):
self.start = start
self.end = end
self.step = step
def __iter__(self):
return self
def __next__(self):
a = self.start
self.start += self.step
if a
return a
else:
raise stopiteration
for i in myrange(1,10,2):
print(i)
上下文管理
上下文 context
這個概念屬於語言學科,指的是一段話的意義,要參考當前的場景,既上下文
在python中,上下文可以理解為是乙個**區間,乙個範圍 ,例如with open 開啟的檔案僅在這個上下文中有效
涉及到的兩個方法:enter:表示進入上下文,(進入某個場景 了)
exit:表示退出上下文,(退出某個場景 了)
當執行with 語句時,會先執行enter ,
當**執行完畢後執行exit,或者**遇到了異常會立即執行exit,並傳入錯誤資訊
包含錯誤的型別.錯誤的資訊.錯誤的追蹤資訊
注意:enter 函式應該返回物件自己
exit函式 可以有返回值,是乙個bool型別,用於表示異常是否被處理,僅在上下文**現異常有用
如果為true 則意味著,異常以及被處理了
false,異常未被處理,程式將中斷報錯
python有類嗎 Python有匿名類嗎?
我想知道python是否有類似c 匿名類特性的東西。為了澄清這一點,這裡有乙個示例c 片段 var foo new var bar new foo.equals bar true 在python中,我可以想象如下 foo record x 1,y 2 bar record y 2,x 1 foo b...
python多型理解 多型有啥用
什麼是多型?多型顧名思義多種狀態,在python中,不同的物件呼叫同乙個介面,表現出不同的狀態,稱為多型。class duck def who self print i am a duck class dog defwho self print i am a dog class cat defwho...
python自學可以嗎 可以自學python嗎?
可以的。既然搜尋到這個問題了,說明想學python,想進入程式設計師這個行業裡來。只要有目標了,想學了,那就肯定可以學。自學python的話,有很多種方式,可以買本書,按照書上講的知識點,一點點學習。這樣效率會慢一些,如果不理解的地方很難有人給你解釋。再就是可以報乙個python的班,跟著老師一起學...