學(xué)了面向?qū)ο笕筇匦岳^承,多態(tài),封裝。今天我們看看面向?qū)ο蟮囊恍┻M階內(nèi)容,反射和一些類的內(nèi)置函數(shù)。
一、isinstance和issubclass
class Foo: passclass Son(Foo): passs = Son()#判斷一個對象是不是這個類的對象,傳兩個參數(shù)(對象,類)print(isinstance(s,Son))print(isinstance(s,Foo))#type更精準(zhǔn)print(type(s) is Son)print(type(s) is Foo)#判斷一個類是不是另一類的子類,傳兩個參數(shù)(子類,父類)print(issubclass(Son,Foo))print(issubclass(Son,object))print(issubclass(Foo,object))print(issubclass(int,object))
二、反射
反射的概念是由Smith在1982年首次提出的,主要是指程序可以訪問、檢測和修改它本身狀態(tài)或行為的一種能力(自省)。這一概念的提出很快引發(fā)了計算機科學(xué)領(lǐng)域關(guān)于應(yīng)用反射性的研究。它首先被程序語言的設(shè)計領(lǐng)域所采用,并在Lisp和面向?qū)ο蠓矫嫒〉昧顺煽儭?/p>
python面向?qū)ο笾械姆瓷洌和ㄟ^字符串的形式操作對象相關(guān)的屬性。python中的一切事物都是對象(都可以使用反射)
四個可以實現(xiàn)反射的函數(shù):hasattr,getattr,setattr,delattr
下列方法適用于類和對象(一切皆對象,類本身也是一個對象)
class Foo: def __init__(self): self.name = 'egon' self.age = 73 def func(self): print(123)egg = Foo()#常用:#hasattr#getattr# print(hasattr(egg,'name'))print(getattr(egg,'name'))if hasattr(egg,'func'): #返回bool Foo_func = getattr(egg,'func') #如果存在這個方法或者屬性,就返回屬性值或者方法的內(nèi)存地址 #如果不存在,報錯,因此要配合hasattr使用 Foo_func()#不常用:#setattr# setattr(egg,'sex','屬性值')# print(egg.sex)# def show_name(self):# print(self.name + ' sb')# setattr(egg,'sh_name',show_name)# egg.sh_name(egg)# show_name(egg)# egg.sh_name()#delattr# delattr(egg,'name')# print(egg.name)# print(egg.name)# egg.func()# print(egg.__dict__)#反射#可以用字符串的方式去訪問對象的屬性、調(diào)用對象的方法反射舉例1
class Foo: f = 123 #類變量 @classmethod def class_method_demo(cls): print('class_method_demo') @staticmethod def static_method_demo(): print('static_method_demo')# if hasattr(Foo,'f'):# print(getattr(Foo,'f'))print(hasattr(Foo,'class_method_demo'))method = getattr(Foo,'class_method_demo')method()print(hasattr(Foo,'static_method_demo'))method2 = getattr(Foo,'static_method_demo')method2()#類也是對象反射舉例2import my_module# print(hasattr(my_module,'test'))# # func_test = getattr(my_module,'test')# # func_test()# getattr(my_module,'test')()#import其他模塊應(yīng)用反射from my_module import testdef demo1(): print('demo1')import sysprint(__name__) #'__main__'print(sys.modules)#'__main__': <module '__main__' from 'D:/Python代碼文件存放目錄/S6/day26/6反射3.py'>module_obj =sys.modules[__name__] #sys.modules['__main__']# module_obj : <module '__main__' from 'D:/Python代碼文件存放目錄/S6/day26/6反射3.py'>print(module_obj)print(hasattr(module_obj,'demo1'))getattr(module_obj,'demo1')()#在本模塊中應(yīng)用反射反射舉例3
新聞熱點
疑難解答