Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何获取链接到类中的方法的名称?_Python_Inspect - Fatal编程技术网

Python 如何获取链接到类中的方法的名称?

Python 如何获取链接到类中的方法的名称?,python,inspect,Python,Inspect,考虑下面的代码示例,它显示了一个简单的类,该类允许通过返回self来进行方法链接 导入检查 类名称(对象): 定义初始化(自): self.hold=无 姓名(自我): self.hold='a' 回归自我 def方法(自我,c): self.hold=self.hold*c 回归自我 c=classname().funcname().method(10) 我想做的是检查c,这样我就可以看到funcname和method是在这个类上调用的 可以这样做,但不能通过inspect,因为实例本身不记

考虑下面的代码示例,它显示了一个简单的类,该类允许通过返回self来进行方法链接

导入检查
类名称(对象):
定义初始化(自):
self.hold=无
姓名(自我):
self.hold='a'
回归自我
def方法(自我,c):
self.hold=self.hold*c
回归自我
c=classname().funcname().method(10)

我想做的是检查
c
,这样我就可以看到
funcname
method
是在这个类上调用的

可以这样做,但不能通过
inspect
,因为实例本身不记得那段历史。您必须添加代码以手动维护调用

class classname(object):
    def __init__(self):
        self.hold = None
        self.calls = []

    def funcname(self):
        self.hold = 'a'
        return self

    def method(self, c):
        self.hold = self.hold * c
        return self

    def __getattribute__(self, name):
        self_calls = object.__getattribute__(self, "__dict__")["calls"]
        self_calls.append(name)
        return object.__getattribute__(self, name)


c = classname().funcname().method(10)
print(c.calls)
我已经为这类东西写过了,我刚刚把它放在GitHub上,以防它对任何人都有用

它通过使用代理包装函数、类或对象来工作,代理记录每次交互。这不仅包括方法的名称,还包括它们的参数和返回值,以及哪些方法调用了哪些其他方法(在树中)

用法:

从跟踪器导入跟踪器
@示踪剂
类名称(对象):
定义初始化(自):
self.hold=无
姓名(自我):
self.hold='a'
回归自我
def方法(自我,c):
self.hold=self.hold*c
回归自我
def递归_方法(self,n):
如果n>0:
自回归法(n-1)
自回归法(n-2)
c=classname().funcname().method(10)
c、 递归法(3)
c、 打印调用树()
输出:

* +-> __init__()
  |
  +-> funcname() +-> <__main__.classname object at 0x0000000002A9EBA8>
  |
  +-> method(10) +-> <__main__.classname object at 0x0000000002AE2160>
  |
  +-> recursive_method(3) +-> recursive_method(2) +-> recursive_method(1) +-> recursive_method(0)
                          |                       |                       |
                          |                       |                       +-> recursive_method(-1)
                          |                       |
                          |                       +-> recursive_method(0)
                          |
                          +-> recursive_method(1) +-> recursive_method(0)
                                                  |
                                                  +-> recursive_method(-1)
*+->\uuuuu init\uuuuu()
|
+->funcname()+->
|
+->方法(10)+->
|
+->递归法(3)+->递归法(2)+->递归法(1)+->递归法(0)
|                       |                       |
||+->递归_方法(-1)
|                       |
|+->递归_方法(0)
|
+->递归_方法(1)+->递归_方法(0)
|
+->递归_方法(-1)

公平警告:它有点脆弱,例如,您可以看到日志显示由
funcname
method
返回的对象的不同id,即使它们应该是具有相同id的同一对象。

您不能,该对象对此没有记忆,您必须自己跟踪它。如果这是你必须知道的,这听起来像是你设计中的一个基本问题。感谢设计反馈@juanpa.arrivillaga。但你是在假设我在这篇文章中的使用案例。如果做不到,我理解,但必须有一种方法来获取这些信息。我并没有说这是不可能的,只是你必须自己跟踪这一点。您必须使用对象的内部状态手动跟踪调用的内容,例如,正在进行的调用的列表,您可以编写一个分解器来分解一些biolerplate,并且更明确。这正是我想要的!谢谢