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()
时调用的函数。
对于你后面的问题:要检查某物是否是对象,请使用isinstance
或issubclass
(可能与object
类一起使用)。在我看来,这个答案比你可能见过的"我如何确定某物是否是函数?"问题的公认答案要好。
要使类实例可调用,您需要做的就是实现一个__call__
方法。 然后,要调用 __call__
方法,您只需执行以下操作: instance(arg1,arg2,...)
-- 换句话说,您调用实例的方式与调用函数的方式相同。
请注意,如果需要,可以使用类上定义的其他方法__call__
别名:
>>> class Foo(object):
... def tick(self):
... print ("something")
... __call__ = tick
...
>>> a = Foo()
>>> a()
something
>>> a.tick()
something