El método __init__ de la clase tiene 3 argumentos, pero cuando lo instancia con 3 argumentos, arroja un error que esperaba 1 argumentos. No puedo entenderlo.

class ArrObj(frozenset):
    def __init__(self, elem_list, elem_count, self_count):
        super(ArrObj, self).__init__(elem_list)  # Enums, ArrObj, race_id
        self.elem_count = elem_count
        self.self_count = self_count
        assert self_count > 0


if __name__ == '__main__':
    a = ArrObj(['a', 'b', 'c'], {'a':1, 'b':2, 'c':3}, 8)
Traceback (most recent call last):
  File "G:/pycharm-projects/new_keyinfo/verify_treekeys.py", line 34, in <module>
    a = ArrObj(['a', 'b', 'c'], {'a':1, 'b':2, 'c':3}, 8)
TypeError: ArrObj expected at most 1 arguments, got 3
1
xupeng 15 oct. 2019 a las 17:21

1 respuesta

La mejor respuesta

frozenset.__init__ no toma argumentos adicionales, porque no puede modificar un frozenset después de que se haya creado. (De hecho, frozenset no define __init__ en absoluto; solo usa el __init__ que hereda de object.) El iterable que pasas a frozenset es consumido por frozenset.__new__ en su lugar.

class ArrObj(frozenset):
    def __new__(cls, elem_list, elem_count, self_count):
        # May as well assert this before you do any more work
        assert self_count > 0

        obj = super().__new__(cls, elem_list)
        obj.elem_count = elem_count
        obj.self_count = self_count
        return obj
1
chepner 15 oct. 2019 a las 15:07