Wywoływanie metod nadklasy w __init__ + bonusik numpy'owy

0

Witam ponownie w sprawie mojego małego projektu z arkusza kalkulacyjnego.

Powiedzmy, że mam już arkusz trzymający komórki, jednak chciałabym móc wykonywać operacje na wierszach/kolumnach. Do tego chcę zastosować podklasę. (NumericCell to moja własna klasa)

Gdy wywołuję metodę dla klasy CellCollection wszystko działa, więc problem musi być gdzieś w dziedziczeniu.

Mam coś takiego:

class CellCollection:
    def __init__(self, n=3):
        self.n = n
        initial = NumericCell(0)
        self.cells = np.full((self.n, self.n), initial, dtype="object")

#... z jakimiś metodami...
#... ale jedną istotną - sliceuje mi arkusz, bym dostała porządany obiekt - gdy wywołuję fukcję działa sprawnie

    def cut(self, shape, nr):
        if shape == "ROW":
            return self.cells[nr, :]
        elif shape == "COLUMN":
            return self.cells[:, nr]

# oraz wspomnianą podklasę:

class OneDimensionCollection(CellCollection):
    # z jakiegos powodu wszystko jest typu NumericCell (dokładniej NumericCell(0)) (nawet po wczytaniu komórek) po wywołaniu self.object_
    def __init__(self, shape, nr_of_shape):
        super().__init__()
        object_ = super().cut(shape, nr_of_shape)
        self.object_ = object_

EXTRA PYTANKO:
Do tworzenia macierzy używam numpy i wypełniam array moimi obiektami. Program działa, jednak coś krzyczy. Powinnam się tym przejmować?

Expected type 'Union[int, float, complex, ndarray, Iterable]', got 'NumericCell' instead

0

Zobacz tak, w Pythonie 3 musisz wprost podać klasę, z której wywołuje object_ = super(OneDimensionCollection, self).cut(shape, nr_of_shape).

Co do ostatniego pytania, to pewnie używasz Pycharm, można te warningi wylaczyć. Nie powinno robić to problemu, ale jak ktoś kiedyś wymyśli sobie użycie np. Black w kodzie to może narobić bigosu. Osobiście warningi staram się traktować jako błędy i je poprawiać.

3

Moja rada: zapomnij że istnieje coś takiego jak dziedziczenie. Serio. To jest mechanizm który stosuje się tylko w bardzo konkretnych sytuacjach, a ty próbujesz go z jakiegoś powodu wciskać wszędzie. Moim zdaniem źle do tego podchodzisz zupełnie. Dla mnie wszystko powinno tu być po prostu dwuwymiarowym zbiorem komórek. Wycięcie jednego rzędu albo kolumny to szczególny przypadek gdzie jeden wymiar na rozmiar 1 i tyle. Nie zmienia to nic.
Moja druga rada: zacznij używać statycznego typowania i type hintów i nagle takie problemy też znikną bo od razu będziesz mieć informacje że typy danych nie pasują do siebie.

4
Dregorio napisał(a):

Zobacz tak, w Pythonie 3 musisz wprost podać klasę, z której wywołuje object_ = super(OneDimensionCollection, self).cut(shape, nr_of_shape).

Po pierwsze -- nieprawda. Przykład:

class A:
    
    def __init__(self):
        print('A // __init__')
        
    def metoda(self, x):
        return 'A // metoda // %r' % (x,)
    
    
class B(A):
    
    def __init__(self):
        super().__init__()
        print('B // __init__')
        print(super().metoda(123))
        
        
b = B()

Po drugie -- i w moim przykładzie i u @Vendia -- super() jest tu całkiem bez sensu. Jak dziedziczysz i nie przesłaniasz, to wystarcz (i powinno być) self.cut(shape, nr_of_shape)

Po trzecie -- @Shalom ma oczywiście rację.

Co do ostatniego pytania, to pewnie używasz Pycharm, można te warningi wylaczyć. Nie powinno robić to problemu, ale jak ktoś kiedyś wymyśli sobie użycie np. Black w kodzie to może narobić bigosu. Osobiście warningi staram się traktować jako błędy i je poprawiać.

Tak należy traktować warningi. A ich wyłączanie to trochę jak zmienianie testów (zamiast kodu testowanego), bo nie przechodzą... :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1