Les objets n'incluent pas les méthodes dans la compréhension de la liste
Cette question est liée à ma question précédente et à la réponse de Bill.
J'ai une classe nommée StrucData dans 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
Dans le fichier principal I:
- appeler le sous-fichier,
- créer une liste de noms de données
- parcourez la liste pour instancier les objets; et
- charger des données en utilisant la méthode 'loadData' pour chaque objet (j'utilise la même 'taille' et 'coût' pour rendre cet exemple facile.)
en une fois en utilisant une compréhension de liste:
# in the main file
from subfile import StrucData
listIndex=['data1','data2','data3']
listObjects = [StrucData(idx).loadData(size=3, cost=4) for idx in listIndex]
La sortie est
listObjects=[object1, object2, object3]
dans lequel chaque objet contient ses attributs définis dans le subfile.py (nom, taille, coût).

Ce que je me demande, c'est quand je définis un objet en utilisant le même code que
x=StrucData(listIndex[0]).loadData(size=3, cost=4)
il contient également la méthode 'loadData'.

Quelqu'un pourrait-il m'expliquer pourquoi cela se produit?
J'utilise la distribution anaconda3 de Spyder, les informations de version sont

Réponses
L'inspecteur utilisé lors du débogage de votre application dans Spyder traite les objets à l'intérieur des listes différemment des objets singuliers du même type. Il affiche simplement différentes choses et - si dans une liste - omet la fonction.
Vous pouvez facilement vérifier si les deux objets ont cette méthode en l'imprimant:
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)
Vous pouvez affecter l'un des éléments de la liste à une variable normale et vérifier sa sortie d'inspecteur pour vérifier:
lO = listObjects[1]
Définissez un point d'arrêt et inspectez-le - la méthode apparaît maintenant.
Quant au pourquoi: demandez aux codeurs responsables du code de l'inspecteur de débogage de Spyder. Comme une supposition hasardeuse: pour enregistrer la zone d'écran lors de l'affichage d'objets qui sont regroupés dans une liste.