Obiekty nie zawierają metod w zrozumieniu listy
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:
- wywołaj podplik,
- utwórz listę nazw danych
- pętla po liście, aby utworzyć instancję obiektów; i
- 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
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.