我想封装一个python数组来修复它的类型代码并将其隐藏起来。我以为我可以使用派生来完成此任务,但我无法构造我的Type,因为它缺少必需的参数:
class MyBinaryBuffer(array.array):
def __init__(self):
array.array.__init__(self, 'B') #this is the fixed 'B' typecode parameter for
#array.array() constructor
myBuffer = MyBinaryBuffer()
我明白了:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: array() takes at least 1 argument (0 given)
我怎么能以自然的方式实现这个呢?
经过一些研究,我发现我应该使用构造函数。
编辑: Sven Marnach建议添加self,指出我在 __ 新 __ 版本中添加了缺少的cls parmeter 作品
class MyBinaryBuffer(array.array):
def __new__(cls):
return super(MyBinaryBuffer, cls).__new__(cls, 'B')
myBuffer = MyBinaryBuffer()
答案 0 :(得分:6)
您需要使用__new__
方法,因为__init__
已经构建了它。但你不在那里使用super
。
class OctetString(array):
def __new__(cls):
return array.__new__(cls, 'c')
答案 1 :(得分:0)
如果要添加自己的属性,请使用新建和 init :
示例:
class Point(array.array):
'''
an array.array with 3 coordinates [x,y,z]
'''
def __new__(cls, clist, parent=None, index=-1):
while len(clist)<3: clist.append(0.0)
return super(Point, cls).__new__(cls,'f', clist[0:3])
def __init__(self, cList=[], parent=None, index=-1):
self._parent = parent # private
self.index = index # public
@property
def parent(self):
return self._parent
p = Point([1,2], parent='anyObject', index=5)
print(p, p.parent, p.index)
答案 2 :(得分:0)
这是在python2.x和python3.x中都经过测试的方法:
from array import array
class MyBinaryBuffer(array):
def __new__(cls, *args, **kwargs):
return super(MyBinaryBuffer, cls).__new__(cls, 'B', *args, **kwargs)
b1 = MyBinaryBuffer([1, 2, 3])
b2 = MyBinaryBuffer()
print(b1, b2)
或者如果您想避免使用super
:
class MyBinaryBuffer(array):
def __new__(cls, *args, **kwargs):
return array.__new__(cls, 'B', *args, **kwargs)
在这种情况下,您将能够完全模仿array.array
的行为,其他现有答案将无法保证。