码迷,mamicode.com
首页 > 编程语言 > 详细

python反射hasattr getattr setattr delattr

时间:2019-01-07 22:34:54      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:strftime   字符串类   modules   ctime   input   内置模块   UNC   obj   pretty   

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

相比于用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)
删除一个属性。
 
 
 

python反射hasattr getattr setattr delattr

标签:strftime   字符串类   modules   ctime   input   内置模块   UNC   obj   pretty   

原文地址:https://www.cnblogs.com/daju/p/10235773.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!