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

Dav*_*vid 4 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()
Run Code Online (Sandbox Code Playgroud)

我明白了:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: array() takes at least 1 argument (0 given)
Run Code Online (Sandbox Code Playgroud)

我怎么能以自然的方式实现这个呢?

经过一些研究,我发现我应该使用构造函数.

编辑:斯文Marnach建议增加自其向我指出添加缺少的CLS parmeter在__ __版本,它的工作原理.

class MyBinaryBuffer(array.array):
    def __new__(cls):
        return super(MyBinaryBuffer, cls).__new__(cls, 'B')

myBuffer = MyBinaryBuffer()
Run Code Online (Sandbox Code Playgroud)

Kei*_*ith 6

您需要使用该__new__方法,因为__init__它已经构建好了.但你不要super在那里使用.

class OctetString(array):
    def __new__(cls):
        return array.__new__(cls, 'c')
Run Code Online (Sandbox Code Playgroud)

  • @Keith关于使用`__new__`而不是`__init__`。Python文档没有提供任何提示。我是否忽略了文档中的某些内容?您在哪里找到有关此信息?如果有确切的来源,请在答案中添加一个链接。 (2认同)