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

2024-05-29 09:49:33 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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}

尽管获得了该方法,但仍会卸载详细的语句

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


Tags: nameinselfnewgetmakemodelmy
1条回答
网友
1楼 · 发布于 2024-05-29 09:49:33

制作一个使用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也包括在内(它是一个语句)

相关问题 更多 >

    热门问题