【发布时间】:2012-02-27 03:11:21
【问题描述】:
我有一个名为 iResource 的接口类和许多子类,每个子类都实现“请求”方法。请求函数对其他机器使用套接字 I/O,因此异步运行它们是有意义的,这样其他机器可以并行工作。
问题是当我用 iResource.request 启动一个线程并给它一个子类作为第一个参数时,它会调用超类方法。如果我尝试以“type(a).request”和“a”作为第一个参数开始它,我会得到“”作为 type(a) 的值。任何想法这意味着什么以及如何获得该方法的真实类型?我能以某种方式在 Python 中正式声明一个抽象方法吗?
编辑:包括代码。
def getSocialResults(self, query=''):
#for a in self.types["social"]: print type(a)
tasks = [type(a).request for a in self.types["social"]]
argss = [(a, query, 0) for a in self.types["social"]]
grabbers = executeChainResults(tasks, argss)
return igrabber.cycleGrabber(grabbers)
"executeChainResults" 接受一个可调用的“tasks”列表和一个 args-tuples 的列表“argss”,并假设每个都返回一个列表。然后它在一个单独的线程中执行每个,并连接结果列表。如有必要,我可以发布该代码,但我没有遇到任何问题,所以我暂时将其省略。
对象“a”绝对不是 iResource 类型,因为它只有一个构造函数,它只是抛出一个异常。但是,用“iResource.request”替换“type(a).request”会调用基类方法。此外,直接调用 "self.types["social"][0].request" 可以正常工作,但上面的代码给了我:"type object 'instance' has no attribute 'request'"。
取消注释注释行会打印<type 'instance'> 多次。
【问题讨论】:
-
你能显示一些代码吗?从我的脑海中,我会说这不应该发生。
-
你需要了解 Duck Typing 的概念
-
请不管你做什么,从
object开始继承你的类——这是从Python 2.2开始的正确做法