使一个类在同一个实例中可调用

时间:2013-01-29 15:07:25

标签: python class callable

class Foo(object):
    def tick(self):
        print("something")

class Bar(object):
    def __init__(self):
        self.foo = Foo()

    def tick(self):
        #Here's what I do....
        self.foo.tick()

        #here's what my goal would be
        self.foo()

b = Bar()
b.tick()

这基本上是我的目标。从我收集到的内容中,我可以将tick函数更改为__call__,这样我就能做我想做的事情。其他几个答案说这会产生一个新的对象实例,这是否意味着它会使用self.foo的内存?或者它会成为一个全新的对象,新实例?或制作self.foo的副本?

还有一些缺点,可能会或可能不会表现出来。对于我的程序的特定部分,我检查对象是否有__call__来确定我传递的参数是函数还是变量,我真的不认为我想要允许要调用的(尽管我认为这个类在技术上会是那个时候的函数。)有没有办法区分函数和可调用类?

还有什么能使这种不受欢迎的事情(这是一种pythonic的工作方式吗?)?我的下一个想法是,鉴于前缀为__的其他变量不能在他们的类之外使用,但这似乎不是这里的情况。

2 个答案:

答案 0 :(得分:23)

tick(self)更改为__call__(self)是正确的解决方案。

这与内存分配无关。所有__call__表示Python(当对象foo)使用语法foo()时调用的函数。

对于您以后的问题:要检查某些内容是否为对象,请使用isinstanceissubclass(可能使用object类)。在我看来this answer比#34}更接受的那个更好;我怎样才能确定某个东西是否是一个功能?"你可能已经看过的问题。

答案 1 :(得分:15)

要使类实例可调用,您需要做的就是实现__call__方法。然后,要调用__call__方法,您只需执行:instance(arg1,arg2,...) - 换句话说,您调用实例的方式与调用函数的方式相同。

请注意,如果您愿意,可以使用该类定义的其他方法对__call__进行别名:

>>> class Foo(object):
...     def tick(self):
...         print ("something")
...     __call__ = tick
... 
>>> a = Foo()
>>> a()
something
>>> a.tick()
something