【问题标题】:how to use__iter__ to dynamically create objects in pythonpython中如何使用__iter__动态创建对象
【发布时间】:2013-02-14 22:46:03
【问题描述】:

好的,所以我正在尝试打印所有汽车对象...我有 2 个问题:

  1. 我实施__iter__ 的方式是否可接受?
  2. 我现在得到了我想要的结果,但结果相当丑陋...有没有办法格式化打印以使其看起来更漂亮?

这是我的代码:

import sqlite3

class Database:

    def __init__(self, **kwargs):
    self.filename = kwargs.get('filename')

    def __iter__(self):
        car_object = {}
        cursor = self._db.execute('select * from CARS'.format(self._table))
        for row in cursor:
            objectname = str(row['IDENT'])
            car_object[objectname] = Cars(make = row['MAKE'], 
            model = row['MODEL'], disp = row['DISPLACEMENT'], 
            power = row['POWER'], luxury = row['LUXURY'])
            yield dict(row)

    @property
    def filename(self):
        return self._filename

    @filename.setter
    def filename(self, fn):
        self._filename = fn
        self._db = sqlite3.connect(fn)
        self._db.row_factory = sqlite3.Row


class Cars: 
    def __init__(self, **kwargs):
        self.variables = kwargs

    def set_Variable(self, k, v):
        self.variables[k] = v

    def get_Variable(self, k):
        return self.variables.get(k, None)

def main():
    db = Database(filename = 'insurance.sqlite')
    print ('IDENT                       MAKE               MODEL                   
    DISPLACEMENT             POWER              LUXURY')
    for item in db:
        print(item['IDENT'], '            ', item['MAKE'], '            ', 
          item['MODEL'],'            ', item['DISPLACEMENT'],
          '            ', item['POWER'],'            ', item['LUXURY'])


if __name__ == "__main__": main()

【问题讨论】:

  • 您的缩进看起来不正确。这不是你的错误的来源,它只是问题的格式问题。
  • @Bryan Oakley...在 Eclipse 中看起来不错,但这个页面让它看起来很奇怪。
  • 没有人会在 Eclipse 中查看您的代码。请花时间为问题正确格式化。最简单的方法可能是您将所有制表符转换为空格,然后再将其粘贴到问题中。
  • 布莱恩,抱歉,我已经编辑过了。谢谢。
  • 它看起来仍然不正确。使用 python,你需要特别勤奋,因为缩进量定义了一行代码所在的块。你的 def 需要比你的 class 语句缩进更多。

标签: python class python-3.x iterator


【解决方案1】:

您不想打印生成器本身,您想打印生成器返回的每个项目。

for item in db:
    print(item)

【讨论】:

  • 谢谢你....你认为像我上面那样有一个'iter'是可以接受的吗?
  • @user2096860 我以前从未真正使用过__iter__,所以我不得不查一下。是的,我认为您正确使用了它,通过在主体中添加yield,该函数将返回一个生成器,这正是您所需要的。我不确定为什么你们既要返回结果又要在内部保存它们。
  • 勒索实际上,我希望能够打印 car_object[objectname] 实例...有什么想法吗?
  • @user2096860 然后你需要分成 2 个循环,一个执行 select 来填充你的字典,然后另一个循环遍历字典并返回每个项目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-07
  • 1970-01-01
  • 2011-04-29
  • 2011-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多