一、反射
1、什么是反射?
用字符串类型的名字去操作变量
2、反射对象中的属性和方法
getattrhasattrsetattrdelettr
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__:执行函数的时候自动执行打印一些属性