反射
2018-10-14 本文已影响1人
Pope_Li
反射是什么
使用字符串数据类型的变量名来获取这个比变量的值
为什么要用反射
三个反射应用场景
-
input
只能输入字符串类型,来获取字符串对应的变量名
-
文件
从文件中读出的字符串,想转化成变量的名字
-
网络
将网络传输的字符串转化成变量的名字
怎么用
hasattr
getattr
1.反射类 中的变量
class Foo:
school = 'oldboy'
country = 'china'
language = 'chinese'
inp = input('>>>').strip()
print(geattr(Foo,inp))
geattr方法:
getattr(变量名:命名空间,字符串:属于一个命名空间内的变量名)
如何执行类中的方法:
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__)#内置变量
print(sys.modules[__name__])#反射本文件中的变量,固定的使用这个命名空间
getattr(sys.modules[__name__],'abc')()
setattr
setattr(Foo,'school','dfsdf')#向某个作用域添加某一个变量,接受三个参数,命名空间,'变量名',变量值)
delattr
class Foo:
country='Chine'
delattr(Foo,'country')
__ str __ __ repr __
不用调用这个方法就可以出发这个方法的执行
class Foo:
def __str__(self):
return 'abcd'
def __repr__(self):
return 'dcba'
obj = Foo()
__str__ :
print(obj)
'%s'%obj
str(obj)
__repr__ : # 当使用会触发str方法的方式,但是Foo类内部又没有实现__str__方法的时候,都会调用__repr__
'%r'%obj
repr(obj)