如何检索对象方法的详细语句?

时间:2017-10-16 15:39:01

标签: python python-3.x

如何检索对象方法的详细语句? 假设一堂课:

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}

尽管已经获得了该方法,仍然会卸载详细的声明。

如何在控制台的交互模式下获取对象方法的语句块?

1 个答案:

答案 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也包括在内(这是一个声明)。