如何判断何时调用另一个类中的函数

时间:2009-05-24 14:03:46

标签: python class

我有两个Python类,称它们为“C1”和“C2”。 C1内部是名为“F1”的函数,C2内部是名为“F2”的函数。有没有办法在每次F1运行时执行F2而不从F1内直接调用F2?是否有其他机制可以知道何时调用另一个类中的函数?

我欢迎任何建议,但想知道实现这一目标的一些方法,而不在C1中创建C2的实例。

6 个答案:

答案 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