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的工作方式吗?)?我的下一个想法是,鉴于前缀为__
的其他变量不能在他们的类之外使用,但这似乎不是这里的情况。
答案 0 :(得分:23)
将tick(self)
更改为__call__(self)
是正确的解决方案。
这与内存分配无关。所有__call__
表示Python(当对象foo
)使用语法foo()
时调用的函数。
对于您以后的问题:要检查某些内容是否为对象,请使用isinstance
或issubclass
(可能使用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