python-2.7 - 如何使用额外参数对同步队列进行子类化
问题描述
我正在尝试对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
解决方案
问题是 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() 使用的相同,只是跳过了类型本身。
新样式类通常是更好的选择
推荐阅读
- c# - 如何在c#中解析json文件,其中属性不特定
- vega-lite - Vega lite 顶部和底部 10
- flutter - 从 QuerySnapshot 中删除重复或组
- javascript - 如何强制 axios 发送空数组?
- angular - 用于 Spring 和 Angular 应用程序的 Nginx 和 Tomcat
- ios - 为什么 Firebase 图像(通过 SdWebImage)加载缓慢?
- ssh - 'C:\Users\User' 不是内部或外部命令、可运行程序或批处理文件
- javascript - 无法同步 mongoose 操作以返回数组
- javascript - .click() 只触发一次然后不再触发,除非我刷新整个页面并且如果我调用 $(document).ready() 则根本不呈现
- python - 熊猫聚合分组与另一列的最大值?