Python 如何获取链接到类中的方法的名称?
考虑下面的代码示例,它显示了一个简单的类,该类允许通过返回self来进行方法链接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.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,并且更明确。这正是我想要的!谢谢