27反射、類的內置方法
阿新 • • 發佈:2018-01-29
modules sel 自己的 刪除字符 __del__ 打印 get time ret
一、反射
1、什麽是反射?
用字符串類型的名字去操作變量
2、反射對象中的屬性和方法
getattr\hasattr\setattr\delettr
3、 getattr:通過字符串類型的名字取到變量的值
hasattr:判斷字符串類型的名字對應的值是否存在
setattr :(建立)設置字符串類型的名字和值
deleattr:刪除字符串類型的變量
getattr:
class A: def func(self): print(‘in func‘) a = A() a.name = ‘alex‘ a.age = 63 # 反射對象的屬性 ret = getattr(a,‘name‘) # 通過變量名的字符串形式取到的值 print(ret)
hasattr(與getattr配合使用)
class A: price=20 @classmethod def func(self): print(‘in the func‘) if hasattr(A,‘func‘): #hasattr判斷是否變量存在 ret=getattr(A,‘func‘) ret()
反射模塊中的屬性和方法:
可以反射模塊(包括內置模塊)的屬性和方法,可以反射自己模塊(其他模塊)的函數和變量,還可以反射一個模塊的類。
#模塊 import my #反射模塊的屬性 print(my.day) print(getattr(my,‘day‘)) #反射模塊的方法 getattr(my,‘wahaha‘)() #內置模塊也能用 time asctime import time print(getattr(time,‘time‘)()) print(getattr(time,‘asctime‘)()) def qqxing(): print(‘qqxing‘) year = 2018 import sys print(sys.modules[‘__main__‘].year) # 反射自己模塊中的變量print(getattr(sys.modules[‘__main__‘],‘year‘)) # 反射自己模塊中的函數 getattr(sys.modules[‘__main__‘],‘qqxing‘)() 變量名 = input(‘>>>‘) print(getattr(sys.modules[__name__],變量名)) #要反射的函數有參數怎麽辦? print(time.strftime(‘%Y-%m-%d %H:%M:S‘)) print(getattr(time,‘strftime‘)(‘%Y-%m-%d %H:%M:S‘)) #一個模塊中的類能不能反射得到? import my print(getattr(my,‘C‘)()) if hasattr(my,‘name‘): getattr(my,‘name‘)
setattr:設置修改值
class A: def func(self): pass a=A() setattr(a,‘name‘,‘alex‘) print(getattr(a,‘name‘))
delattr:刪除一個變量
# delattr 刪除一個變量 delattr(a,‘name‘) print(a.name) delattr(A,‘name‘) print(a.name)
二、類的內置方法
__str__ 、__repr__、__del__、__len__、__call__
__str__:自己沒有__str__方法的時候,就去父類object去調用,返回調用這個方法的對象的內存地址,如果自己定義了__str__方法,那麽就執行自己的__str__方法,打印這個對 象的時候,就會執行a.__str__方法(默認就執行了),(返回一些自己定義的方法)。
class A: def __str__(self): return "A‘s object" a=A() print(a)
__repr__:類似__str__方法,就是調用repr執行的內置方法,%r,print(repr)也是執行的它(不知道它有什麽用)
__del__:析構函數,刪除一個對象之前進行一些收尾工作
__call__:執行函數的時候自動執行打印一些屬性
27反射、類的內置方法