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

Dan*_*din 16 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()
Run Code Online (Sandbox Code Playgroud)

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

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

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

Bor*_*lid 24

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

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

对于您以后的问题:要检查某些东西是否是某个对象,请使用isinstanceissubclass(可能与object该类一起使用).在我看来,这个答案比"我如何确定某些东西是否具有某种功能?"的答案要好.你可能已经看过的问题.


mgi*_*son 15

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

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

>>> class Foo(object):
...     def tick(self):
...         print ("something")
...     __call__ = tick
... 
>>> a = Foo()
>>> a()
something
>>> a.tick()
something
Run Code Online (Sandbox Code Playgroud)