反射是什么
使用字符串?dāng)?shù)據(jù)類型的變量名來獲取這個比變量的值
為什么要用反射
三個反射應(yīng)用場景
-
input
只能輸入字符串類型,來獲取字符串對應(yīng)的變量名
-
文件
從文件中讀出的字符串,想轉(zhuǎn)化成變量的名字
-
網(wǎng)絡(luò)
將網(wǎng)絡(luò)傳輸?shù)淖址D(zhuǎn)化成變量的名字
怎么用
hasattr
getattr
1.反射類 中的變量
class Foo:
school = 'oldboy'
country = 'china'
language = 'chinese'
inp = input('>>>').strip()
print(geattr(Foo,inp))
geattr方法:
getattr(變量名:命名空間,字符串:屬于一個命名空間內(nèi)的變量名)
如何執(zhí)行類中的方法:
class Foo:
school = 'oldboy'
country = 'china'
language = 'chinese'
@classmethod
def stat(cls):
print(cls.school)
2.反射對象中的變量
- 對象屬性
- 普通方法
3.反射模塊中的變量
import os#os就是一個模塊
os.rename()
getattr(os,'rename')()
4.反射本文件中的變量
a=1
b=2
name = 'li'
def abc():
print('abc')
import sys
print(sys.modules['__main__'])#本文件的命名空間
print(sys.modules['__main__'].a)
print(__name__)#內(nèi)置變量
print(sys.modules[__name__])#反射本文件中的變量,固定的使用這個命名空間
getattr(sys.modules[__name__],'abc')()
setattr
setattr(Foo,'school','dfsdf')#向某個作用域添加某一個變量,接受三個參數(shù),命名空間,'變量名',變量值)
delattr
class Foo:
country='Chine'
delattr(Foo,'country')
__ str __ __ repr __
不用調(diào)用這個方法就可以出發(fā)這個方法的執(zhí)行
class Foo:
def __str__(self):
return 'abcd'
def __repr__(self):
return 'dcba'
obj = Foo()
__str__ :
print(obj)
'%s'%obj
str(obj)
__repr__ : # 當(dāng)使用會觸發(fā)str方法的方式,但是Foo類內(nèi)部又沒有實現(xiàn)__str__方法的時候潭苞,都會調(diào)用__repr__
'%r'%obj
repr(obj)