Les objets n'incluent pas les méthodes dans la compréhension de la liste

Nov 27 2020

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:

  1. appeler le sous-fichier,
  2. créer une liste de noms de données
  3. parcourez la liste pour instancier les objets; et
  4. 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

2 PatrickArtner Nov 27 2020 at 12:23

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.