首页 > 解决方案 > 如何使用额外参数对同步队列进行子类化

问题描述

我正在尝试对Queue进行子类化,以下代码引发异常:

from Queue import Queue

class MyQueue(Queue, object):
    def __init__(self, my_stuff = None):
        super(MyQueue, self).__init__()
        self.my_stuff = my_stuff

    def my_function(self):
        return self.my_stuff

__main__这样称呼它:

a_queue = MyQueue(my_stuff = "some stuff")
print a_queue

正如预期的那样,我得到了:

$ ./my_queue.py
some stuff

但只有当我也继承自object(每个新式类)时,我才会明白这一点。否则我得到:

Traceback (most recent call last):
File "./my_queue", line 13, in <module>
  a_queue = MyQueue(my_stuff = "some stuff")
File "./my_queue", line 6, in __init__
  super(MyQueue, self).__init__()
TypeError: must be type, not classobj

为什么?它显然不像 mp.Process 那样适用于 Queue (参见这个问题这个问题)。

标签: python-2.7

解决方案


问题是 Queue 类不支持super功能,因为它是一个旧样式类。这种从对象继承的方式将解决您的问题(使其成为新的样式类)。但是如果你想避免它,只需直接调用 init

将其更改为:

from  Queue import Queue

class MyQueue(Queue):
     def __init__(self, my_stuff = None):
         Queue.__init__(self)
         self.my_stuff = my_stuff

     def my_function(self):
         return self.my_stuff

而 python 中的旧类不能做到这一点 新样式类可以使用super(Foo, self)其中 Foo 是类而 self 是实例。

super(type[, object-or-type])

返回一个代理对象,它将方法调用委托给类型的父类或同级类。这对于访问已在类中重写的继承方法很有用。搜索顺序与 getattr() 使用的相同,只是跳过了类型本身。

样式类通常是更好的选择


推荐阅读