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

标签 python list object list-comprehension instantiation

这个问题与 my previous question以及比尔在那里的回应。

我在 subfile.py 中有一个名为 StrucData 的类

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 中定义的属性(名称、大小、成本)。 enter image description here

我想知道的是,当我使用与以下代码相同的代码定义一个对象时

x=StrucData(listIndex[0]).loadData(size=3, cost=4) 

它也包含“loadData”方法。 enter image description here

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

我使用的是Spyder的anaconda3发行版,版本信息为 enter image description here

最佳答案

在 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调试检查器代码的coder。作为一个冒险的猜测:在显示捆绑在列表中的对象时节省屏幕空间。

关于python - 对象不包括列表推导中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65036850/

相关文章:

css - 为什么我的 <ul> 不是从我的 <div> 继承的?

javascript - 如何删除逗号并替换为句点javascript

javascript - 如果属性未定义,如何将对象写为键

python - Scikit-Learn:如何执行最佳子集 GLM 泊松回归?

python - 如何在基于 Django 类的 View 中访问当前用户

python - 使用至少 n 个空格拆分字符串

C++ - 好的还是坏的做法?

python - 更改当前进程环境的 LD_LIBRARY_PATH

python - 如何将新列表附加到现有 CSV 文件?

python - 根据另一个列表对列表 'in place' 重新排序