Obiekty nie zawierają metod w zrozumieniu listy

Nov 27 2020

To pytanie jest związane z moim poprzednim pytaniem i odpowiedzią Billa.

Mam klasę o nazwie StrucData w subfile.py

class StrucData:  
    def __init__(self, name):
        self.name=name
    
    def loadData(self, size=1, cost=1):
        self.size=size  
        self.cost=cost
        return self

W głównym pliku I:

  1. wywołaj podplik,
  2. utwórz listę nazw danych
  3. pętla po liście, aby utworzyć instancję obiektów; i
  4. załaduj dane za pomocą metody „loadData” dla każdego obiektu (używam tego samego „rozmiaru” i „kosztu”, aby ułatwić ten przykład).

za jednym razem, używając rozumienia listy:

# in the main file

from subfile import StrucData 

listIndex=['data1','data2','data3']
listObjects = [StrucData(idx).loadData(size=3, cost=4) for idx in listIndex]

Wynik jest

listObjects=[object1, object2, object3]

w którym każdy obiekt zawiera swoje atrybuty zdefiniowane w subfile.py (nazwa, rozmiar, koszt).

Zastanawiam się, kiedy definiuję jeden obiekt za pomocą tego samego kodu co

x=StrucData(listIndex[0]).loadData(size=3, cost=4) 

zawiera również metodę „loadData”.

Czy ktoś mógłby mi wyjaśnić, dlaczego tak się dzieje?

Używam dystrybucji Spyder Anaconda3, informacja o wersji to

Odpowiedzi

2 PatrickArtner Nov 27 2020 at 12:23

Inspektor używany podczas debugowania aplikacji w Spyder traktuje obiekty na listach inaczej niż pojedyncze obiekty tego samego typu. Po prostu wyświetla różne rzeczy i - jeśli na liście - pomija funkcję.

Możesz łatwo sprawdzić, czy oba obiekty mają tę metodę, drukując ją:

listIndex = ['data1','data2','data3']
listObjects = [StrucData(idx).loadData(size=3, cost=4) for idx in listIndex]

other = StrucData("other").loadData(size=3, cost=4) 

print(listObjects[0].loadData)
print(other.loadData)

Możesz przypisać jeden z elementów listy do zwykłej zmiennej i sprawdzić jej wynik inspektora, aby sprawdzić:

lO = listObjects[1]

Ustaw punkt przerwania i sprawdź go - teraz pojawia się metoda.

Jeśli chodzi o dlaczego: zapytaj programistów odpowiedzialnych za kod inspektora debugowania Spydera. Jako ryzykowne przypuszczenie: aby zaoszczędzić miejsce na ekranie podczas wyświetlania obiektów, które są umieszczone na liście.