本站消息

站长简介/公众号


站长简介:高级软件工程师,曾在阿里云,每日优鲜从事全栈开发工作,利用周末时间开发出本站,欢迎关注我的微信公众号:程序员总部,程序员的家,探索程序员的人生之路!分享IT最新技术,关注行业最新动向,让你永不落伍。了解同行们的工资,生活工作中的酸甜苦辣,谋求程序员的最终出路!

  价值13000svip视频教程,python大神匠心打造,零基础python开发工程师视频教程全套,基础+进阶+项目实战,包含课件和源码

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

Python 将唯一的类对象添加到列表中

发布于2021-12-22 06:39     阅读(1107)     评论(0)     点赞(18)     收藏(4)



将对象添加到列表时遇到问题。当我将对象附加到列表的末尾,然后尝试遍历它时,列表中的每个位置只会返回最近添加的对象。

该脚本比较来自 Excel 电子表格中不同项目的信息。我使用 Python for Windows 和 win32com.client 来访问我感兴趣的电子表格。有与他们相同的错误(在循环中初始化列表,在创建类对象时不提供输入属性)。

我可以注释掉循环中的对象创建,并简单地将数字添加到列表中,并且能够打印出所有三个唯一值,但是一旦我将对象创建调用放回去,事情就会出错。下面的代码只打印三个最近添加的项目。任何帮助将不胜感激,谢谢!

class Project:
    """
    Creates an instance for each project
    in the spreadsheet
    """

    def __init__(self, bldg, zone, p_num, p_name, p_mgr,
                 const_mgr, ehs_lias, ehs_const, status,
                 p_type, start, finish):
        self.bldg = bldg
        self.zone = zone
        self.p_num = p_num
        self.p_name = p_name
        self.p_mgr = p_mgr
        self.const_mgr = const_mgr
        self.ehs_lias = ehs_lias
        self.ehs_const = ehs_const
        self.status = status
        self.p_type = p_type
        self.start = start
        self.finish = finish

    def quickPrint(self):
            """ prints quick glance projects details """
            if p_name is None:
                pass
            else:
                print 'Building ' + str(bldg.Value)
                print str(p_name.Value)
                print str(p_type.Value) + " -- " + str(p_mgr.Value)
                print str(start.Value) + " - " + str(finish.Value)


projects = []
for i in range(25, 28):
    bldg = excel.Cells(i,1)
    zone = excel.Cells(i,2)
    p_num = excel.Cells(i,3)
    p_name = excel.Cells(i,4)
    p_mgr = excel.Cells(i,5)
    const_mgr = excel.Cells(i,6)
    ehs_lias = excel.Cells(i,7)
    ehs_const = excel.Cells(i,8)
    status = excel.Cells(i,9)
    p_type = excel.Cells(i,10)
    start = excel.Cells(i,11)
    finish = excel.Cells(i,12)
    projects.append(Project(bldg, zone, p_num, p_name, p_mgr,
                        const_mgr, ehs_lias, ehs_const,
                        status, p_type, start, finish))
projects[0].quickPrint()
projects[1].quickPrint()
projects[2].quickPrint()

解决方案


我认为你定义quickPrint不正确。就它而言,p_name, p_type,p_mgr等没有定义,所以它进一步查找作用域解析树,或者它被调用的任何东西,然后最终找到它们——你上次在 for 循环中定义它们的地方,这就是为什么它给你最后的价值。

因为您在循环中使用了相同的变量名,所以您隐藏了这个问题,并使其更加混乱。

def quickPrint(self):
        """ prints quick glance projects details """
        if self.p_name is None:
            pass
        else:
            print 'Building ' + str(self.bldg.Value)
            print str(self.p_name.Value)
            print str(self.p_type.Value) + " -- " + str(self.p_mgr.Value)
            print str(self.start.Value) + " - " + str(self.finish.Value)

例子:

class Project(object):
  def __init__(self, argument):
    self.argument = argument

  def __repr__(self):
    return str(argument)

projects = []  
for i in range(10):
  argument = i
  projects.append(Project(argument))

print projects

这输出 [9, 9, 9, 9, 9, 9, 9, 9, 9, 9]

更改__repr__(self):定义以self.argument修复它。







所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/1186675/8acaaa15668b45e7f139/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

18 0
收藏该文
已收藏

评论内容:(最多支持255个字符)