Objekte enthalten keine Methoden im Listenverständnis
Diese Frage bezieht sich auf meine vorherige Frage und Bills Antwort dort.
Ich habe eine Klasse namens StrucData in 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
In der Hauptdatei I:
- Rufen Sie die Subdatei auf,
- Erstellen Sie eine Liste mit Datennamen
- Durchlaufen Sie die Liste, um die Objekte zu instanziieren. und
- Laden Sie Daten mit der Methode 'loadData' für jedes Objekt (ich verwende dieselbe 'Größe' und 'Kosten', um dieses Beispiel zu vereinfachen.)
auf einmal mit einem Listenverständnis:
# in the main file
from subfile import StrucData
listIndex=['data1','data2','data3']
listObjects = [StrucData(idx).loadData(size=3, cost=4) for idx in listIndex]
Die Ausgabe ist
listObjects=[object1, object2, object3]
in dem jedes Objekt seine in der Datei subfile.py definierten Attribute enthält (Name, Größe, Kosten).

Ich frage mich, wann ich ein Objekt mit demselben Code wie definiere
x=StrucData(listIndex[0]).loadData(size=3, cost=4)
es enthält auch die Methode 'loadData'.

Könnte mir bitte jemand erklären, warum es passiert?
Ich benutze die Anaconda3-Distribution von Spyder, die Versionsinformationen sind

Antworten
Der Inspektor, der beim Debuggen Ihrer Anwendung in Spyder verwendet wird, behandelt Objekte in Listen anders als einzelne Objekte desselben Typs. Es zeigt einfach verschiedene Dinge an und lässt - wenn in einer Liste - die Funktion aus.
Sie können leicht überprüfen, ob beide Objekte diese Methode haben, indem Sie sie drucken:
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)
Sie können einer normalen Variablen eines der Listenelemente zuweisen und die Inspektorausgabe überprüfen, um Folgendes zu überprüfen:
lO = listObjects[1]
Setzen Sie einen Haltepunkt und überprüfen Sie ihn - jetzt wird die Methode angezeigt.
Zum Warum: Fragen Sie die Codierer, die für den Code des Debugging-Inspektors von Spyder verantwortlich sind. Als riskante Vermutung: Zum Speichern von Bildschirmen bei der Anzeige von Objekten, die in einer Liste gebündelt sind.