1. 程式人生 > >python摸爬滾打之day19----instance, type, issubclass和反射

python摸爬滾打之day19----instance, type, issubclass和反射

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()
9 l = LanCat() 10 print(isinstance(Cat(),Animal)) # True 判斷前者是否是後者的一個物件 11 print(issubclass(Cat,Animal)) # True 判斷cat是不是animal的子類
isinstance

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("不存在此類別.")
通過字串匯入模組