一:多型與多型性
多型:指的是同一種事物有多種形態,
多型性:指的是不考慮物件屬于哪種型別的情況下使用物件,
例:
import abc
class Animal(metaclass=abc.ABCMeta):
@abc.abstractmethod
def talk(self):
pass
class Dog(Animal):
def talk(self):
print("汪汪汪")
class Cat(Animal):
def talk(self):
print('喵喵!')
class Pig(Animal):
def talk(self):
print("哼哼哼!")
obj1 = Dog()
obj2 = Cat()
obj3 = Pig()
obj1.talk()
obj2.talk()
obj3.talk()
def talk(animal):
animal.talk()
talk(obj1)
talk(obj2)
talk(obj3)
class Dog:
def talk(self):
print("汪汪汪")
class Cat:
def talk(self):
print('喵喵!')
class Pig:
def talk(self):
print("哼哼哼!")
1.1 鴨子型別
只要看著像鴨子,長的像鴨子,那就是鴨子型別,
例:
# 代碼示范:強制子類使用父類的方法
import abc
class Animal(metaclass=abc.ABCMeta): # 定義抽象基類,Animal已不可單獨呼叫
@abd.abstractmethod # 強制約束所有子類都得有這些功能
def say(self):
print('動物是這樣叫的',end='')
class Dog(Animal):
def say(self):
super().say()
print('汪汪汪')
class Cat(Animal):
def say(self):
super().say()
print('喵喵喵')
class Pig(Animal):
def say(self):
super().say()
print('哼哼哼')# 定義了抽象基類,給父類的功能添加裝飾器后,就規定了子類定義名字相同的這些功能,如果子類沒有,就會報錯
二:反射
反射機制被視為動態陳述句的核心,在程式運行程序中,動態獲取資料的資訊,當程式獲取物件的時候,程式能夠動態獲取到物件的屬性,方法等等,
2.1 反射機制的實作原理
先通過print(dir(物件))拿到這個物件所有的內置功能,發現都是字串格式,再想辦法取到字串屬性對應的功能物件.dict[字串屬性],
2.2 四個內置函式的使用
hasattr
getattr
setattr
delattr
四個內置方法將在下面統一演示:
class RealEstate:
address='北京'
def __init__(self,name):
self.name=name
def tell_info(self):
print(self.name)
obj1=RealEstate('龍湖地產')
# haveattr(物件/類,屬性的字串格式)----->bool
print(haveattr(obj1,'age'))-----># False
print(haveattr(RealEstate,'address'))-----># True
# getattr(物件/類,屬性的字串格式,default:None)----->找到的話回傳屬性的值,找不到的話回傳default的值
print(getattr(obj1,'name'))-----># '龍湖地產'
print(getattr(obj1,'address','抱歉,該屬性不存在'))-----># '抱歉,該屬性不存在'
res=getattr(RealEstate,''tell_info)
res(obj1)-----># '龍湖地產'
# setattr(物件/類,屬性,屬性的新值)----->屬性存在的話則重新賦值,不存在的話則創建屬性
setattr(obj1,'money','一個億')
print(obj1.money)
setter(obj1,'name','啊哈地產')
print(obj1.name)-----># '啊哈地產'
# delattr(物件/類,屬性)----->屬性存在則洗掉屬性,屬性不存在報錯
delattr(obj1,'namenamename')-----># 報錯
delattr(obj1,'address')-----># 洗掉address屬性
例:
class FtpServer:
def put(self):
print('正在執行上傳功能')
def get(self):
print('正在執行從下載功能')
def interactive(self):
module=input('>>>:').strip()
if hasattr(self,method):
getattr(self,method)()
else:
print('輸入的指令不存在')
obj=FtpServer()
obj,interactive()
三. 內置方法
1:什么是內置方法?
定義在類內部,以__開頭并以__結尾的方法
特點:會在某種情況下自動觸發執行
2:為什么用內置方法?
為了定制化我們的類or物件
3:怎么用內置方法?
3.1 str,repr,format
str__方法會在列印的時候自動觸發,只能回傳一個字串,同樣效果的還有__repr(self),format(self,format_spec)
例:
class People:
def __init__(self,name,age):
self.name=name
self.age=age
def __str__(self):
return '{}:{}'.format(self.name,self.age)
obj1=People('wth',20)
print(obj1)-----># 'wth:20'
當__str__,repr__同時存在的時候,會按照__str__規定的格式進行列印,
3.2 del
析構方法,當物件在記憶體中被釋放時(清理記憶體時被清理掉),自動觸發執行,如果產生的物件僅僅只是python程式級別的,那么無需定義__del,如果產生物件的同時還會向作業系統發起資源呼叫,即一個物件有用戶級與內核級兩種資源,比如(這個物件的一個屬性鏈接到了檔案物件或者資料庫),則必須在清楚物件的同時回收作業系統資源,這就用到了__del__,如果我們在檔案的行程中沒有釋放記憶體中的物件的名稱空間,程式檔案運行完后其占用的資源也會被記憶體回收,
class Teacher:
def __init__(self,name,age):
self.name=name
self.age=age
self.f=open('a.txt','wb')
def __str__(self):
return '{}---{}'.format(self.name,self,age)
def __del__(self):
self.f.close()
print('over')
# 情況一:
obj1=Teacher('wth',20)
print('結束啦')
# 如果在所有代碼運行結束后沒有洗掉物件,__del__會自動執行
# 程式運行結果:
'結束啦'
'over'
# 情況二:
obj1=Teacher('wth',20)
del obj1
print('結束啦')
# 如果先呼叫洗掉物件,則在程式結束后,不需要回收物件占用的記憶體空間
# 程式運行結果:
'over'
'結束啦'
3.3 其他內置方法
link
四. 元類
什么是原類?
例:
class People:
def __init__(self,name,age)
self.name=name
self.age=age
def say(self):
print('{}-{}'.format(self.name,self.age))
# 如何得到物件:
obj=呼叫類()
obj=People('wth',20)
# 如何得到類
2:為什么要有原類?
3:怎么用原類?
五:例外處理
1:什么是例外?
例外是錯誤發生的信號,程式一旦出錯就會產生一個例外,如果該例外沒有被處理,該例外就會拋出來,程式的運行也隨即終止,
錯誤分為兩種:
· 語法錯誤
· 邏輯錯誤
2:如何處理例外?
監測例外的具體語法:
try:
被檢測代碼塊
except 例外型別1:
針對例外型別1的解決方法
except 例外型別2:
針對例外型別2的解決方案
except Exception: # 如果不論什么例外解決方案都固定,則可以只保留這部分
針對其他例外型別的解決方案
else: # 不能只有try和else,語法錯誤
當被監測代碼塊沒有出現例外執行的代碼
finally:
無論被監測代碼有沒有出現例外都會執行的操作,一般是回收系統資源的操作
例:
list1=[1,2,3,4,5]
index=input('請輸入您想取元素的位置:').strip()
try:
res=list1[int(index)]
print(res)
except IndexError:
print('抱歉,您輸入想索引元素的位置超出了串列的長度')
except ValueError:
print('抱歉,請輸入數字!')
拋出例外的例子:
l=[11,22]
if len(l)==3:
print(123)
else:
raise Exception('抱歉串列中元素不足三個')
六 例外其他
1:斷言 (測驗程式的時候使用)
l=[11,22]
assert len(l)==3 # 如果宣告的內容成立,assert陳述句當作不存在,但如果assert的內容不滿足,會拋出AssertionError
2:拋出例外
raise 例外的的型別或者自定義例外的型別
3:自定義例外(通過BaseException)
class Permission(BaseException):
def __str__(self):
return '抱歉,您沒有獲得許可批準!'
raise Permission
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/249907.html
標籤:python
