如何子类array.array并使其派生构造函数在python中不带参数?

时间:2011-02-01 21:44:12

标签: python constructor new-operator

我想封装一个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()

3 个答案:

答案 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的行为,其他现有答案将无法保证。