|
Python的反射机制可以动态获取对象信息以及动态调用对象,本文介绍如何获取对象中的函数注释信息以及参数信息。
定义一个Person类:- class Person():
- def talk(self, name, age, height=None):
- """talk function
- :return:
- """
- print(f"My name is {name}")
- print(f"My age is {age}")
- if height is not None:
- print(f"My height is {height}")
复制代码 dir() 命令也可以获取函数的属性信息:- person = Person()
- print(dir(person))
- func = getattr(person, "talk")
- print(dir(func))
复制代码 结果- ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'talk']
- ['__call__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__func__', '__ge__', '__get__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
复制代码 获取函数注释信息
可以通过 doc 属性来获取注释信息(三引号括起来的注释):- func = getattr(person, "talk")
- print(func.__doc__)
复制代码 结果获取函数参数
1、 通过 __code__ 属性读取函数参数信息
- >> print(dir(func.__code__))
- ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'co_argcount', 'co_cellvars', 'co_code', 'co_consts', 'co_filename', 'co_firstlineno', 'co_flags', 'co_freevars', 'co_kwonlyargcount', 'co_lnotab', 'co_name', 'co_names', 'co_nlocals', 'co_stacksize', 'co_varnames']>>
- #学习中遇到问题没人解答?小编创建了一个Python学习交流群:725638078
- print("co_name: ", func.__code__.co_name) # 返回函数名
- print("co_argcount: ", func.__code__.co_argcount) # 返回函数的参数个数
- print("co_varnames: ",func.__code__.co_varnames) # 返回函数的参数
- print("co_filename: ", func.__code__.co_filename) # 返回文件绝对路径
- print("co_consts: ", func.__code__.co_consts)
- print("co_firstlineno: ",func.__code__.co_firstlineno) # 返回函数行号
- print("co_kwonlyargcount: ",func.__code__.co_kwonlyargcount) # 关键字参数
- print("co_nlocals: ",func.__code__.co_nlocals) # 返回局部变量个数
复制代码 结果- co_name: talk
- co_argcount: 4
- co_varnames: ('self', 'name', 'age', 'height')
- co_filename: D:/ProgramWorkspace/PythonNotes/00-Python-Essentials/demo.py
- co_consts: ('talk function\n :return:\n ', 'My name is ', 'My age is ', None, 'My height is ')
- co_firstlineno: 44
- co_kwonlyargcount: 0
- co_nlocals: 4
复制代码 通过 code.co_varnames 可以获取参数名,参数默认值可以通过如下方式获得:结果2、通过inspect库来读取函数参数信息
除了用__code__ 属性外还可以使用inspect库来读取函数参数,使用getfullargspec和signature方法来读取函数参数:- import inspect
- # inspect.getargspec(func) # python2
- argspec = inspect.getfullargspec(func)
- print(argspec.args)
- print(argspec.defaults)
- print(argspec.varkw)
- sig = inspect.signature(func)
- print(sig)
复制代码 结果- ['self', 'name', 'age', 'height']
- (None,)
- None
- (name, age, height=None)
复制代码 也可以在函数内部使用:- class Person(): def talk(self, name, age, height=None): """talk function
- :return: """ frame = inspect.currentframe() args, _, _, values = inspect.getargvalues(frame) print(inspect.getframeinfo(frame)) print(f'function name: {inspect.getframeinfo(frame).function}') for i in args: print(f"{i} = {values[i]}")if __name__ == '__main__': p = Person() p.talk("zhangsan", 18, height=175)
复制代码 结果- Traceback(filename='D:/ProgramWorkspace/PythonNotes/00-Python-Essentials/demo.py', lineno=44, function='talk', code_context=[' print(inspect.getframeinfo(frame))\n'], index=0)
- function name: talk
- self = <__main__.Person object at 0x0000023E4CF17B08>
- name = zhangsan
- age = 18
- height = 175
复制代码 来源:https://www.cnblogs.com/python1111/p/17296568.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作! |
|