一:isinstance和issubclasspython
# 對象與類之間的關係 # 判斷第一個參數是不是第二個參數的實例 # 身份運算 2 == 3 # 值是否相等 2 is 3 # 內存地址是否相等 class A:pass class B(A):pass class C(B):pass c = C() print(isinstance(c,A)) # 包含繼承關係的判斷 print(type(b) is B) * 會報錯 type只關心建立這個對象的類 print(type(b) is A) # 只關心建立這個對象的類t* 會報錯 # 類與類之間的關係 issubclass() class A:pass class B(A):pass print(issubclass(A,B)) print(issubclass(B,A)) # 第一個參數是疑似子類,第二個參數是疑似父類. # 最終結果若是真的是父子類關係,則返回True
二:反射編程
# 反射的定義 : 經過字符串 來 操做python代碼中的 變量 函數 甚至類和方法 # class A: # name = 'alex' # 靜態 屬性 # age = 83 # 靜態 屬性 # hasattr getattr # print(getattr(A,'name')) 無實例化,就用類名,Python類也是一個對象 # print(hasattr(A,'name')) # 在類中使用 類中獲取類的靜態屬性 # tag = input('>>>') # if hasattr(A,tag): # print(getattr(A,tag)) # 屬性的值 = getattr(類名,字符串數據類型的屬性名) # 若是第二個參數是不存在的屬性名,則會報錯 # class Student: def __init__(self,name,age): self.name = name self.age = age def show(self): for key in self.__dict__: print(key,self.__dict__[key]) yuan = Student('苑昊',38) # yuan.show() # 'show' if hasattr(yuan,'name'): print(getattr(yuan,'name')) if hasattr(yuan,'show'): func = getattr(yuan,'show') func()
打印結果:sass
苑昊
name 苑昊
age 38網絡
反射2:函數
hasassr getattr 類.靜態屬性 getattr(類,'靜態屬性') 對象.方法 getattr(對象,'方法')() 直接反射獲得一個方法以後調用 對象.對象屬性 應用場景 : 網絡編程 從文件中讀取信息反映到編程中 setattr delattr class Student: def __init__(self,name,age): self.name = name self.age = age def show(self): for key in self.__dict__: print(key,self.__dict__[key]) hei = Student('小黑',18) hei.sex = '不詳' print(hei.sex) setattr(hei,'sex','不詳') # 增改操做 print(hei.sex) setattr(hei,'sex','male') print(hei.sex) delattr(hei,'sex') # 刪除操做 print(hei.__dict__) def wahaha(a,b): # 專屬於某一個對象的靜態方法 print(a,b) setattr(hei,'func',wahaha) #這樣寫有問題 print(hei.__dict__) hei.func(1,2) hasattr 判斷某一個 變量 是否可以.調用一個名字,返回True或者False getattr 直接獲取一個變量中的名字的值 setattr 爲一個變量增長或者修改一個屬性 delattr 刪除一個變量中的屬性或者方法 d = {'k':'v'} #d.keys() print(getattr(d,'keys')()) f = open() # f文件操做對象 f.read() # 文件對象.read方法
打印結果:spa
不詳
不詳
male
{'name': '小黑', 'age': 18}
{'name': '小黑', 'age': 18, 'func': <function wahaha at 0x00000000003B2E18>}
1 2
dict_keys(['k'])ssr
包內的文件對象
# 包 # import 包名 ---> 包內的__init__文件 # def sww(): # print('爽歪歪') # count = 0 import sys # print(sys.modules[__name__]) # 必定是aaa.py # print(sys.modules['__main__']) # 不肯定的 # print(getattr(sys.modules[__name__],'count')) # getattr(sys.modules[__name__],'sww')() # print(sys.modules[__name__]) # # print(sys.modules['my_moudle']) # # print(my_moudle) # print(getattr(sys.modules['my_moudle'],'qqxing')) # 反射類中的名字 # getattr(類名,'靜態屬性') # getattr(類名,'類方法')() # getattr(類名,'靜態方法')() # 反射對象中的名字 # getattr(對象名,'對象屬性') # getattr(對象名,'方法名')() # 反射模塊中的名字 # import 模塊名 # getattr(模塊名,'模塊中的變量') # getattr(模塊名,'模塊中的函數')() # getattr(模塊名,'模塊中的類名') # 反射當前模塊中的名字 # import sys # getattr(sys.modules[__name__],'變量') # getattr(sys.modules[__name__],'函數')() # getattr(sys.modules[__name__],'類名') # sys.modules[__name__] # import sys # print(sys.modules[__name__]) # 全部導入過的模塊 # {'字符串數據類型的模塊名':模塊的內存地址} # {'__main__':當前模塊的內存地址} # 怎麼反射類 ? # class Student: # def __init__(self,name,age): # self.name = name # self.age = age # def show_student(self): # for key in self.__dict__: # print(key,self.__dict__[key]) # # class Teacher: # def __init__(self, name, age): # self.name = name # self.age = age # # def show_teacher(self): # for key in self.__dict__: # print(key, self.__dict__[key]) # # class Manager: # def __init__(self, name, age): # self.name = name # self.age = age # # def show_manager(self): # for key in self.__dict__: # print(key, self.__dict__[key]) # # hei = Student('小黑',18) # import sys # main = sys.modules[__name__] # # import my_moudle # # cls = getattr(my_moudle,'Student') # # hei = cls('小黑',18) # # print(hei,hei.__dict__) # # # 'Manager' 'Teacher' 'Student' # # 獲取字符串數據類型的類名 # cls_name = input('>>>') # # # 根據輸入反射找到具體的類 # if hasattr(main,cls_name): # cls = getattr(main,cls_name) # # # 實例化對象 # alex = cls('alex',81) # print(type(alex)) # # 展現這個對象中的全部方法 # for i in alex.__dict__: # print(i,alex.__dict__[i]) # # # 用反射的知識 實現 # # 寫一我的類,這我的類 沒有任何屬性 實例化這個類 而後根據你的姓名和年齡爲這個對象添加屬性 (基礎) # # 登陸成功以後自動建立和用戶身份匹配的類的對象