python反射之访问元数据(二)

226 阅读2分钟

1 内建函数和方法相关的属性

内建的模块是指用C写的模块,可以通过sys模块的builtin_module_names字段查看哪些模块为内建模块。这些模块中的函数和方法的属性被使用的不多,这里只做了解即可。

内置函数和方法相关的属性如下表所示

属性说明
doc函数或方法的文档
name函数或方法定义时的名字
self只有方法有这个属性,可以调用所属类或实例
module函数或方法所在模块名

示例如下:

print(abs.__doc__)

result:

Return the absolute value of the argument.
print(abs.__name__)

result:

abs
print(abs.__self__)

result:

<module 'builtins' (built-in)>
print(abs.__module__)

result:

builtins

2 自定义函数相关的属性

自定义函数相关的属性如下表所示

属性说明
doc函数的文档
name函数定义时的名字
module函数对应的模块名,而不是模块对象
dict是一个包含函数里面可用属性名、可用属性构成的字典

示例如下:

def test_func(name, age, sex="男"):
    """
    返回个人信息
    :param name: 姓名
    :param age: 年龄
    :param sex: 性别
    :return: 个人信息
    """
    return name + "," + age + "," + sex
​
​
​
print(test_func.__doc__)

result:

返回个人信息
:param name: 姓名
:param age: 年龄
:param sex: 性别
:return: 个人信息
print(test_func.__name__)

result:

test_func
print(test_func.__module__)

result:

__main__
print(test_func.__dict__)

result:

{}

3 自定义方法相关的属性

属性说明
doc方法的文档
name方法定义时的名字
module对应的模块名,而不是模块对象
dict是一个包含方法里面可用属性名、可用属性构成的字典
func获取方法里实际函数的引用
self指向方法的调用者,类或者类的实例
class方法的类型

示例如下:

class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age
​
    def say(self):
        """
        说话的方法
        """
        print(f"{self.name}在谈话")
​
​
p = Person("小明", 23)
print(p.say.__doc__)

result:

    说话的方法
print(p.say.__name__)

result:

say
print(p.say.__module__)

result:

__main__
print(p.say.__func__)

result:

<function Person.say at 0x000001A374974AF8>
print(p.say.__self__)

result:

<__main__.Person object at 0x0000024859439748>
print(p.say.__class__)

result:

<class 'method'>

4 生成器相关的属性

属性说明
gi_code生成器对应的code对象
gi_frame生成器对应的frame对象
gi_running生成器是否在执行,生成器在yield以后,执行yield之后的代码前该值为0
gen = (i for i in range(5))
print(gen.gi_code)
print(gen.gi_frame)
print(gen.gi_running)

result:

<code object <genexpr> at 0x00000288B9BE3780, file "D:/workspace/test_study/test_study/test.py", line 10>
<frame at 0x00000288B96A24D8, file 'D:/workspace/test_study/test_study/test.py', line 10, code <genexpr>>
False