【发布时间】:2013-01-13 04:55:42
【问题描述】:
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()
这基本上就是我的目标。根据我收集到的信息,我可以将刻度函数更改为__call__,这样我就可以做我想做的事了。其他几个答案说这将创建一个对象的新实例,这是否意味着它将使用 self.foo 的内存?还是会创建一个全新的对象,新实例化?或者复制一份 self.foo?
我还想到了一些可能会或可能不会表现出来的缺点。对于我程序的特定部分,我检查对象是否有 __call__ 以确定我传递的参数是函数还是变量,我真的不认为我会允许它被调用(即使,我认为该类在技术上将是一个函数。)有没有办法区分函数和可调用类?
还有什么东西会让这样做不受欢迎(这是一种 Python 的工作方式吗?)?我的下一个想法是,考虑到其他以__ 为前缀的变量不能在他们的班级之外使用,但这里似乎并非如此。
【问题讨论】:
-
实现
__call__将不会创建对象的新实例。执行TheClass()会创建一个新实例,但some_instance()只是调用__call__。 -
我只是在你没有想到的情况下提到这一点 -- 但是,使用上面非常简单的代码,让
Bar继承自Foo似乎是一个不错的选择-- 当然,您的用例可能不是一个好选择...