简体   繁体   中英

Why is the first argument of child's constructor being used in parent's constructer when inheriting `bitstring.BitArray`?

I want my class to inherit the BitArray class but I'm running into a problem in the constructors. I have several positional and keyword arguments I want to use in the child but the first positional argument is always used in the parent for some reason. Does anybody know why this is and how to fix it?

Example Code:

from bitstring import BitArray

class MyClass(BitArray):
    def __init__(self, var1, kwvar1=None, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.var1=var1
        self.kwvar1=kwvar1


a = MyClass('0xff', kwvar1="myvar")
print(a.b) # this should be empty
print(a.var1)
print(a.kwvar1)

Output:

11111111
0xff
myvar

The output of ab should be empty since I didn't pass any extra arguments that would have been passed to super().__init__() , but instead it is a BitArray of ones. Furthermore, if I do give MyClass extra arguments, then I get a key error. For instance, if I change the code above to:

a = MyClass('0xff','0x0f0f', kwvar1="myvar")

then I get a KeyError :

C:\Python\Python311\Lib\site-packages\bitstring.py", line 964, in __new__
    return _cache[auto]
           ~~~~~~^^^^^^
KeyError: '0xff'

It seems to me that in this example ab should return 00110011 since '0x0f0f' would normally be the first argument passed to super().__init__() right? What am I missing here?

It's because the BitArray defines the __new__() . See the implementation .

So, do like this.

from bitstring import BitArray

class MyClass(BitArray):
    def __init__(self, var1, *args, kwvar1=None, **kwargs):
        super().__init__(*args, **kwargs)
        self.var1=var1
        self.kwvar1=kwvar1

    def __new__(cls, var1, *args, kwvar1=None, **kwargs):
        return super().__new__(cls, *args, **kwargs)

And don't forget to reorder kwvar1 and args arguments.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM