python反射hasattr getattr setattr delattr

反射 : 是用字符串类型的名字 去操作 变量

相比于用eval('print(name)') 留有 安全隐患

 反射 就没有安全问题

hasattr 语法:

hasattr(object, name)
object可以是对象,类,模块,当前Py文件.
name是一个给字符串数据类型,可以是变量(属性),函数(方法)。
如果name在object中存在,则返回Ture,否则返回False。

getattr与hasattr语法相同,返回的结果是对应name的值或函数。

 反射对象的方法
a.func()
 ret = getattr(a,'func')
 ret()

 class A:
     price = 20
     @classmethod
     def func(cls):
         print('in func')
 反射类的属性
 A.price
print(getattr(A,'price'))

 反射类的方法 :classmethod staticmethod
 A.func()
 if hasattr(A,'func'):
     getattr(A,'func')()

模块
 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')

注意:反射本py文件的name时

用sys.modules[__name__]取代sys.modules['__main__'],因为当别的文件把此py文件作为模块导入后__main__变为新的文件了,使用__name__变量则保证不会出现语法错误。





setattr() 语法:


setattr(object, name, value)
设置属性值

delattr 语法:

delattr(object, name)
删除一个属性。
 
 
 
posted @ 2019-01-07 21:26  曜有丨光  阅读(117)  评论(0编辑  收藏  举报