我有两个Python类,称它们为“C1”和“C2”。 C1内部是名为“F1”的函数,C2内部是名为“F2”的函数。有没有办法在每次F1运行时执行F2而不从F1内直接调用F2?是否有其他机制可以知道何时调用另一个类中的函数?
我欢迎任何建议,但想知道实现这一目标的一些方法,而不在C1中创建C2的实例。
答案 0 :(得分:3)
你可以写一个小助手装饰器来为你打电话。优点是通过查看代码可以很容易地判断谁将调用什么。您可以根据需要添加任意数量的函数调用。它就像注册回调函数一样:
from functools import wraps
def oncall(call):
def helper(fun):
@wraps(fun)
def wrapper(*args, **kwargs):
result = fun(*args, **kwargs)
call()
return result
return wrapper
return helper
class c1:
@classmethod
def f1(cls):
print 'f1'
class c2:
@classmethod
@oncall(c1.f1)
def f2(cls):
print 'f2'
>>> c2.f2()
f2
f1
>>> c1.f1()
f1
答案 1 :(得分:2)
我相信你想要做的事情会适合Aspect Oriented Programming的领域。但是我从未使用过这种方法,甚至不知道它是否可以用Python实现。
修改我刚刚查看了我提供的链接,发现提到了8 Python implementations。所以已经为你做了艰苦的工作: - )
答案 2 :(得分:2)
自Python 2.2以来,您可以使用函数和方法装饰器进行面向方面编程:
@decorator(decorator_args)
def functionToBeDecorated(function_args) :
pass
答案 3 :(得分:2)
这实际上取决于你不想直接从F1内拨打F2的原因。你总是可以创建一个封装C1和C2的第三类(C3)。当调用F3时,它将同时调用F1和F2。这称为Mediator模式 - http://en.wikipedia.org/wiki/Mediator_pattern
答案 4 :(得分:1)
不知道你想要达到的是什么,我建议看看pydispatcher。 它允许您实现Observer模式
基本上,您将F2与调度程序一起注册,以便在发出特定“信号”时调用它。你的F1'会发出一个信号,上面写着“我被称为”。然后,调度员调用F2(或任何已经使用该特定信号注册的功能)。 它实际上比它听起来更简单,易于使用,并且解耦你的代码(F1不需要知道F2)。
(arhh ..我是新用户,不允许包含超链接,但pydispatcher很容易google for)
答案 5 :(得分:0)
您可以使用__getattr__
捕获对F1的所有访问。这将允许您进行额外处理或返回自己的功能代替F1
class C1:
def __getattr__(self,name):
if name == 'F1': C2.F2()
return self[name]
我应该警告你,即使只是访问F1(不运行),这也会调用C2.F2。很少但并非不可能简单地将F1用于f = myC1.F1
之类的其他目的。要仅在F1调用时运行F2,您需要展开此示例以将F2与返回的函数对象组合。换句话说:
def F1F2():
self.F1()
C2.F2()
return F1F2