面向物件高階 之 自動觸發的內建函式
---恢復內容開始---
一. isinstance(obj, 類) 判斷物件是不是某個類的例項
print(isinstance(1,int)) class Person: pass p = Person() print(isinstance(p,Person)) # 結果都為True
二. issubclass(子類,父類) 判斷是否為子類,可以是子子類
class Person: pass class Student(Person): pass print(issubclass(Student,Person)) # 結果為True
三. 反射
當獲得了一個物件,但不清楚物件的內部細節,用到反射
1. hasattr : 是否存在某個attribute
2. getattr : 得到 attribute
3. setattr: 設定 attribute
4. delattr: 刪除 attribute
class Person: def __init__(self,name,age): self.name = name self.age = age def eating(self): print('everybody can eat') p = Person('egon',18) # 判斷是否有屬性(返回 True, False) print(hasattr(p, 'name')) #設定屬性 setattr(p,'gender','male') print(p.__dict__) #{'name': 'egon', 'age': 18, 'gender': 'male'}
# 設定方法
def run(self):
print('everyone can run')
setattr(p,'run',run)
p.run(p) # 如果是外部新增的函式,呼叫時必須傳入物件作為引數(因為他只是一個函式,不是方法)
# 得到屬性,三個引數,如果沒有要找的屬性,返回第三個值內容 res = getattr(p,'gender','沒有該屬性') print(res) # male res = getattr(p,'wo','沒有這個屬性') print(res) # 沒有這個屬性 # 刪除屬性 delattr(p,'name') print(p.name) # 屬性已經刪除,報錯
特殊的內建函式:
一般情況下,帶槓槓的內建函式都是在某些時機自動觸發的
1. __str__ : 列印時呼叫的函式,必須返回字串
2. __del__ : 當程式執行結束時,物件從記憶體中被刪除時會自動執行
刪除的兩種方式:1. 手動刪除 del stu
2. 當程式執行結束後自動刪除__del__
__del__ 用途: 開啟檔案佔兩方面記憶體: 應用程式記憶體和作業系統記憶體
python 自己建立的資料,在執行結束後自動清理,但當使用python開啟一個不屬於python管理的資料,就需要__del__ 函式手動設定關閉。
# 例:__del__ 實際應用 class TextFile: def __init__(self,filepath,mode = 'rt',encoding = 'utf-8'): self.file = open(filepath,mode = mode,encoding=encoding) def read(self): return self.file.read() def write(self,text): self.file.write(text) # 通知程式設計師,物件即將被刪除 def __del__(self): self.file.close() tf = TextFile('a.txt',mode = 'wt') tf.write('aaaa')
3. exec :excute 表示執行
作用: 解析字串中的python程式碼,並將得到的名稱儲存到指定的名稱空間
引數1:需要一個字串物件, 字串中為python語句
引數2:是一個字典,全域性名稱空間
引數3:也是一個字典,區域性名稱空間
注意: 如果沒有宣告全域性,預設為區域性變數
語法: exec(msg,globalsdic,localsdic)
4. __call__ : 呼叫物件時執行,執行的是物件所在類中的__call__方法
class People: def __call__(self, *args, **kwargs): print('call is running!') def eat(self): print('everyone need to eat') p = People() p() # call is running!
總結:呼叫物件,物件的類中的__call__方法執行
總結四種內建的自動觸發的函式:
# People = type(...) class Foo: #物件例項化時自動觸發 def __init__(self): pass #列印時自動觸發,必須存在返回值,返回值為字串 def __str__(self): pass # 程式執行結束,物件被刪除時,自動觸發 def __del__(self): pass # 呼叫物件時,自動觸發物件所在類中的__call__函式 def __call__(self, *args, **kwargs): pass obj = Foo() # 建立物件,__init__函式自動觸發 print(obj) # 列印自動觸發 __str__ obj(1,2,3) # 自動執行__call__方法 (引數為: self:obj *args: 1,2,3