Objetos não incluem métodos na compreensão da lista
Esta pergunta está relacionada à minha pergunta anterior e à resposta de Bill lá.
Eu tenho uma classe chamada StrucData em 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
No arquivo principal I:
- chame o subarquivo,
- crie uma lista de nomes de dados
- percorrer a lista para instanciar os objetos; e
- carregar dados usando o método 'loadData' para cada objeto (estou usando o mesmo 'tamanho' e 'custo' para tornar este exemplo fácil.)
de uma vez usando uma compreensão de lista:
# in the main file
from subfile import StrucData
listIndex=['data1','data2','data3']
listObjects = [StrucData(idx).loadData(size=3, cost=4) for idx in listIndex]
A saída é
listObjects=[object1, object2, object3]
em que cada objeto contém seus atributos definidos no subfile.py (nome, tamanho, custo).

O que me pergunto é quando defino um objeto usando o mesmo código que
x=StrucData(listIndex[0]).loadData(size=3, cost=4)
ele contém o método 'loadData' também.

Alguém poderia me explicar por que isso acontece?
Eu uso a distribuição anaconda3 do Spyder, a informação da versão é

Respostas
O inspetor usado ao depurar seu aplicativo dentro do Spyder trata os objetos dentro das listas de maneira diferente de objetos singulares do mesmo tipo. Ele simplesmente exibe coisas diferentes e - se estiver em uma lista - omite a função.
Você pode verificar facilmente se ambos os objetos têm este método imprimindo-o:
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)
Você pode atribuir um dos elementos da lista a uma variável normal e verificar a saída do inspetor para verificar:
lO = listObjects[1]
Defina um ponto de interrupção e inspecione-o - agora o método aparece.
Quanto ao porquê: pergunte aos programadores responsáveis pelo código do inspetor de depuração do Spyder. Como uma suposição arriscada: para salvar o estado da tela ao exibir objetos que estão agrupados em uma lista.