对象不包括列表推导中的方法

Objects does not include methods in the list comprehension

这个问题与 以及 Bill 的回复。

我在 subfile.py

中有一个名为 StrucData 的 class
class StrucData:  
    def __init__(self, name):
        self.name=name
    
    def loadData(self, size=1, cost=1):
        self.size=size  
        self.cost=cost
        return self

在我的主文件中:

  1. 调用子文件,
  2. 创建数据名称列表
  3. 遍历列表以实例化对象;和
  4. 使用每个对象的 'loadData' 方法加载数据(我使用相同的 'size' 和 'cost' 来简化此示例。)

一次使用列表理解:

# in the main file

from subfile import StrucData 

listIndex=['data1','data2','data3']
listObjects = [StrucData(idx).loadData(size=3, cost=4) for idx in listIndex]

输出为

listObjects=[object1, object2, object3]

其中每个对象都包含其在subfile.py中定义的属性(名称、大小、成本)。

我想知道当我使用与

相同的代码定义一个对象时
x=StrucData(listIndex[0]).loadData(size=3, cost=4) 

它也包含方法'loadData'。

谁能给我解释一下为什么会这样?

我使用的是Spyder的anaconda3发行版,版本信息为

在 Spyder 中调试您的应用程序时使用的检查器对待列表中的对象与处理相同类型的单一对象的方式不同。它只是显示不同的东西,并且 - 如果在列表中 - 省略功能。

您可以通过打印轻松检查两个对象是否具有此方法:

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)

您可以将列表元素之一分配给普通变量并检查其检查器输出以验证:

lO = listObjects[1]

设置断点并检查它 - 现在该方法出现了。

至于为什么:请教负责Spyder调试检查员代码的编码人员。作为一个冒险的猜测:在显示捆绑在列表中的对象时节省屏幕空间。