【发布时间】:2020-07-22 21:08:03
【问题描述】:
我正在尝试在调用实例方法时打印一条消息,如下所示。我遇到了this problem,但在我的情况下我无法解决它,因为所有解决方案似乎都需要传递我在此处无法执行的特定参数。
class MathLab:
def add(self, a, b):
print(a + b)
def mult(self, a, b):
print(a * b)
m = MathLab()
for method in [m.add, m.mult]:
def tracked_method(*args, **kwargs):
print("Running: " + method.__name__)
method(*args, **kwargs)
m.__setattr__(method.__name__, tracked_method)
m.add(5, 5)
输出
Running: mult
25
【问题讨论】:
-
我会猜测你是在寻找装饰师,同时考虑到你之前的问题。
-
@roganjosh 再次嗨 :) 是的,这个问题是切线相关的......我正在编写一个辅助函数,它将在 DataFrame 上打印 dunder 方法的名称,因为它们被调用,所以我可以尝试弄清楚是否有一个在每次更新时都会被调用,然后我可以覆盖。如果我无法弄清楚,我可以尝试再问一次
-
:) 我想你会很挣扎。您的建议(在我的脑海中)是您希望在不创建 API 的情况下随心所欲地使用这些东西。标记到 every 方法 - 如果您不尝试控制某些东西,为什么要记录它?
-
@roganjosh 是的,如果我正在编写自己的类,我会使用装饰器,但现在我只是想修补 DataFrame 的方法,以便它告诉我修改时运行的 dunder 方法它。然后我可以修改那些 dunder 方法以在修改时打印一条通知用户的语句。我知道所有这些猴子补丁看起来都很脏,但如果你对我的第一个问题有其他解决方案,我欢迎!
-
groupby怎么样?那是 Cython 代码,很常见 - 这甚至叫你可以追踪的 dunder 吗?
标签: python closures args keyword-argument late-binding