使类在同一实例中可调用


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的工作方式吗?我的下一个想法是,鉴于其他前缀为 __ 的变量不能在他们的类之外使用,但这里似乎并非如此。

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

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

对于你后面的问题:要检查某物是否是对象,请使用isinstanceissubclass(可能与object类一起使用)。在我看来,这个答案比你可能见过的"我如何确定某物是否是函数?"问题的公认答案要好。

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

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

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

相关内容

  • 没有找到相关文章

最新更新