如何检索对象方法的详细语句? 假设一堂课:
class Car:
def __init__(self,make, model,year):
self.make = make
self.model = model
self.year = year
def get_descriptive_name(self):
return self.make + ' ' + self.model + ' ' + str(self.year)
将其复制到控制台并创建实例。
my_new_car = Car('Mars_Rocket','MR5',2017)
检索信息:
In [52]: vars(my_new_car)
Out[52]: {'make': 'Mars_Rocket', 'model': 'MR5', 'year': 2017}
然而,我想要的是:
{'make': 'Mars_Rocket', 'model': 'MR5', 'year': 2017 \
'get_descriptive_name':'self.make + ' ' + self.model + ' ' + str(self.year)'}
还有一步,我尝试dir()
:
In [53]: attrs = [ i for i in dir(my_new_car) if not i.startswith('__')]
In [54]: attrs
Out[54]: ['get_descriptive_name', 'make', 'model', 'year']
In [57]: {attr:getattr(my_new_car, attr) for attr in attrs }
Out[57]:
{'get_descriptive_name': <bound method Car.get_descriptive_name of <__main__.Car object at 0x10517deb8>>,
'make': 'Mars_Rocket',
'model': 'MR5',
'year': 2017}
尽管已经获得了该方法,仍然会卸载详细的声明。
如何在控制台的交互模式下获取对象方法的语句块?
答案 0 :(得分:1)
制作一个使用inspect.getsourcelines
来抓取方法内容的小帮手:
from inspect import getsourcelines
from types import MethodType
def mydir(obj):
names = [name for name in dir(obj) if not name.startswith('__')]
for name in names:
val = getattr(obj, name)
if not isinstance(val, MethodType):
yield (name, val)
else:
val = "\n".join(map(str.strip, getsourcelines(val)[0][1:])
yield (name, val)
这假定传递了一个实例,然后遍历对象中的名称,如果它们不是Method
类型,则只返回它们的名称和值。如果它们使用getsourcelines
,则删除第一行(函数def)并删除缩进(可能不是一个好主意)。
它产生的元组可以输入dict
:
dict(mydir(my_new_car))
Out[33]:
{'get_descriptive_name': "return self.make + ' ' + self.model + ' ' + str(self.year)",
'make': 'Mars_Rocket',
'model': 'MR5',
'year': '2017'}
它抓取方法中的所有内容,return
也包括在内(这是一个声明)。