Python学习系列之反射

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python学习系列之反射相关的知识,希望对你有一定的参考价值。

反射的定义

根据字符串的形式去某个对象中操作成员

  1. 根据字符串的形式去某个对象中寻找成员
  2. 根据字符串的形式去某个对象中设置成员
  3. 根据字符串的形式去某个对象中删除成员
  4. 根据字符串的形式去某个对象中判断成员是否存在

反射相关函数

getattr(object,name,[default])

根据字符串的形式去某个对象中寻找成员

自定义一个模块(用来测试寻找这个模块里的某个成员)

# 自定义模块的内容
[[email protected] ~]# cat commons.py 
#!/usr/bin/env python
Blog_Url = "www.cnblogs.com/zhaijunming5"
def f1():
    return "F1"
def f2():
    return "F2"

在commons模块里寻找某个成员

>>> import commons
>>> getattr(commons, "f1") <function f1 at 0x7fbce5774598> #表示找个这个成员了 >>> getattr(commons, "f1f1f1") Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: module commons has no attribute f1f1f1 #表示没找到这个成员,报错了

执行获取到的成员(函数)

>>> target_func = getattr(commons, "f1")

>>> target_func
<function f1 at 0x7fbce5774598>

>>> target_func() 
F1

通过设置默认值可以避免获取不到方法时报错

# 设置一个默认值为None
>>> target_func = getattr(commons, "f1f1f1", None)
>>> target_func
>>>

通过getattr获取模块中的全局变量

>>> import commons
>>> getattr(commons, "Blog_Url", None)
www.cnblogs.com/zhaijunming5

setattr(object,name,value)

根据字符串的形式去某个对象中设置成员

设置全局变量

# 获取commons内的Name变量
>>> getattr(commons, "Name", None)
# 在commons模块中设置一个全局变量Name,值为Ansheng
>>> setattr(commons, "Name", "ZhaiJunMing")
# 获取commons内的Name变量
>>> getattr(commons, "Name", None)
ZhaiJunMing

delattr(object,name)

根据字符串的形式去某个对象中删除成员

>>> getattr(commons, "Name")
ZhaiJunMing
>>> delattr(commons, "Name")
# 获取不到就报错
>>> getattr(commons, "Name")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module commons has no attribute Name

hasattr(object,name)

根据字符串的形式去某个对象中判断成员是否存在

# 如果不存在就返回False
>>> hasattr(commons, "Name")
False
>>> setattr(commons, "Name", "ZhaiJunMing")
# 如果存在就返回True
>>> hasattr(commons, "Name")
True

 


以上是关于Python学习系列之反射的主要内容,如果未能解决你的问题,请参考以下文章

Python系列之反射函数

Python系列之 - 反射

学习系列之反射

《C#零基础入门之百识百例》(一百)反射详解 -- 检索特性

《C#零基础入门之百识百例》(一百)反射详解 -- 检索特性

Python学习第14篇:面向对象之反射以及内置方法