python摸爬滾打之day19----instance, type, issubclass和反射
阿新 • • 發佈:2018-11-09
1、issubclass(a,b) ----> 判斷a是否是b的子類(可以向上判斷, 即考慮繼承關係往父類判斷)
isinstance(a,b) ----> 判斷a這個物件是否是b的
type(a) ----> 獲取到a物件的型別, type是不考慮繼承關係的.
1 class Animal: 2 pass 3 class Cat(Animal): 4 pass 5 class LanCat(Cat): 6 pass 7 8 c = Cat()isinstance9 l = LanCat() 10 print(isinstance(Cat(),Animal)) # True 判斷前者是否是後者的一個物件 11 print(issubclass(Cat,Animal)) # True 判斷cat是不是animal的子類
2、區分函式和類的成員方法
結論: 1, 物件訪問的, 就是方法; 類名訪問的, 就是函式;
2, 對於靜態方法, 都是函式;
3, 對於類方法, 都是方法(任何類其實都是type類的物件,即物件訪問)
from types import FunctionType, MethodType
print( isinstance(xxx, FunctionType) )
print( isinstance(xxx, MethodType) )
3、反射
通過字串的形式從物件中動態的獲取成員.
hasattr(obj,str) ----> 判斷obj中是否有str成員(最常用)
getattr(obj,str) ----> 從obj中獲取str成員(最常用)
setattr(obj,str,new) ----> 將obj中的str進行重寫, 重寫內容為new內容
delattr(obj,str) ----> 刪除obj中的str成員
說明:
以上操作都是對記憶體中的檔案進行修改的, 並不會影響原始碼.
1 class Base: 2 base = "父類的" 3 def chi(self): 4 print("吃的開心") 5 def he(self): 6 print("喝的好撐") 7 8 class Sclass(Base): 9 son = "子類的" 10 def __init__(self,name): 11 self.name = name 12 def wan(self): 13 print("玩得舒服") 14 p = Sclass("防滑鏈") 15 16 print(getattr(p,"name")) 17 print(getattr(p,"son")) 18 print(getattr(Sclass,"son")) 19 print(getattr(p,"base")) 20 print(getattr(Base,"base")) 21 22 print(getattr(p,"wan")) # 從物件裡找,找到的是wan()方法的記憶體地址 23 print(getattr(Sclass,"wan")) # 從類裡找,找到的是wan()函式的記憶體地址. 24 print(getattr(p,"wan")()) 25 26 # 如果想反射到別的.py檔案,就必須匯入 "import py檔名" ,getattr(py檔名.類名,str)反射
反射的另類用法: 通過字串匯入模組(原理不是反射, 只是有步驟用到了反射)
1 path = "字串匯入模組.example.fanshe" # 模組路徑 2 import importlib 3 inp = input("請輸入要檢視的類別[f1,f2,f3]: ") 4 m = importlib.import_module(path) # 通過字串的形式來匯入模組 5 if hasattr(m.Cate,inp): # m.Cate, 即inp是否在類的成員方法裡面, 不能寫直接寫m, 找不到的 6 obj = m.Cate() # 建立obj物件 7 print(getattr(obj,inp)()) 8 else: 9 print("不存在此類別.")通過字串匯入模組