首页 > 解决方案 > Python中的类和对象引用,不了解如何返回值

问题描述

编辑:这被标记为重复,因为我询问如何正确打印课程项目。这是我问题的一部分,是的,但我对对象实例的交互以及一般引用事物的方式更加困惑。这很有帮助。另外,我本来应该这样做的,但是我已经包含了 MITx 的(在线 mooc)解决方案,用于创建我一直在学习的 0/1 背包问题的“袋子”创建。这可能更清楚地说明了他们为什么要编写classandbuildItems函数。

我现在已经阅读了大量的教程,试图理解在 python 中对象引用和类实例的创建,但无法弄清楚为什么我会得到这个我没有见过的特定输出。

我有这个程序片段:

class Item(object):
     def __init__(self, n, v, w):
         self.name = n
         self.value = float(v)
         self.weight = float(w)
     def getName(self):
         return self.name
     def getValue(self):
         return self.value
     def getWeight(self):
         return self.weight
     def __str__(self):
         return '<' + self.name + ', ' + str(self.value) + ', '\
                    + str(self.weight) + '>'


def buildItems():
    return [Item(n,v,w) for n,v,w in (('clock', 175, 10),
                                      ('painting', 90, 9),
                                      ('radio', 20, 4),
                                      ('vase', 50, 2),
                                      ('book', 10, 1),
                                      ('computer', 200, 20))]

编辑(其余代码)

def yieldAllCombos(items):
    N = len(items)
    # Enumerate the 3**N possible combinations
    for i in range(3**N):
        bag1 = []
        bag2 = []
        for j in range(N):
            if (i // (3 ** j)) % 3 == 1:
                bag1.append(items[j])
            elif (i // (3 ** j)) % 3 == 2:
                bag2.append(items[j])
        yield (bag1, bag2)

编辑结束

这些是我一直在研究的一个介绍性背包问题的一部分,这个问题让我意识到我不明白类和对象实例到底发生了什么。

如果我理解buildItems(),它将创建Item该类的 6 个不同实例并返回包含这些实例的列表。

尝试做一些简单的事情,我想在函数中创建包含这些默认值的单个列表buildItems()。只是为了测试我这样做:

myitems = buildItems()
print(myitems)

我期待看到这样的列表列表:

[[clock,175,10], [painting,90,9], [radio,20,4], [vase, 50, 2], [book, 10, 1], [computer, 200, 20]]

我得到的是:

[[<__main__.Item object at 0x7f2ce7819650>, <__main__.Item object at 0x7f2ce67cfa90>, <__main__.Item object at 0x7f2ceb766a50>, <__main__.Item object at 0x7f2ceb766d10>, <__main__.Item object at 0x7f2cebc9ba90>, <__main__.Item object at 0x7f2ceb4ec210>]]

我意识到哪些是实际的对象和内存中的位置,对吗?我需要做什么才能返回实际数据?另外,我尝试将buildItems类定义的内部和外部都放在里面,如果我把它放在里面,它需要我在 中包含selfdef buildItems(self)但是如果我这样做的话,我会更加困惑:

项目 = 项目.buildItems()

我得到:

TypeError: buildItems() missing 1 required positional argument: 'self'

我的理解是“自我”总是被暗示的。如果我这样做:

items = Item.buildItems(self)

它显然返回一个"error 'self' is undefined"

我只是很困惑,我似乎无法弄清楚这个例子和我最初学习课程时有什么不同。

任何帮助指导我完成此操作将不胜感激,我觉得它会在概念上为我解锁很多。

标签: pythonpython-3.xclass

解决方案


这里有几件事需要考虑:

  1. 您的功能buildItems不属于您的Item课程。这意味着调用Item.buildItems()不起作用。这应该给出错误AttributeError: type object 'Item' has no attribute 'buildItems'。您提供的错误消息可能是由于缩进实际上不同?

  2. __str__(self)如果您实际上将项目转换为字符串,则将调用您的函数,如下所示:

    myitems = buildItems()
    print(str(myitems[0])) # results in '<clock, 175.0, 10.0>'
    
  3. 但是,您正在调用 print 到对象列表,并且该__repr__(self)函数将用于为列表中的每个元素生成一个字符串。因此,您需要__repr__(self)按如下方式覆盖该函数:

    class Item(object): 
          def __init__(self, n, v, w): 
              self.name = n 
              self.value = float(v) 
              self.weight = float(w) 
          def getName(self): 
              return self.name 
          def getValue(self): 
              return self.value 
          def getWeight(self): 
              return self.weight 
          def __str__(self): 
              return '<' + self.name + ', ' + str(self.value) + ', '\ 
                         + str(self.weight) + '>' 
          def __repr__(self): 
              return str([self.name, self.value,self.weight])
    

编辑:

这将产生你想要的输出。然而,这与__repr__@ShadowRanger 评论中提到的函数背后的意图不一致。实现输出的更好方法可以通过复制粘贴到终端中,如下所示:

def __repr__(self): 
    return self.__class__.__name__+ repr((self.name, self.value,self.weight))

`


推荐阅读