python有多型嗎 Python 多型

2021-10-11 11:18:45 字數 4516 閱讀 8819

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的班,跟著老師一起學...