python - Python中的类和对象引用,不了解如何返回值
问题描述
编辑:这被标记为重复,因为我询问如何正确打印课程项目。这是我问题的一部分,是的,但我对对象实例的交互以及一般引用事物的方式更加困惑。这很有帮助。另外,我本来应该这样做的,但是我已经包含了 MITx 的(在线 mooc)解决方案,用于创建我一直在学习的 0/1 背包问题的“袋子”创建。这可能更清楚地说明了他们为什么要编写class
andbuildItems
函数。
我现在已经阅读了大量的教程,试图理解在 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
类定义的内部和外部都放在里面,如果我把它放在里面,它需要我在 中包含self
,def buildItems(self)
但是如果我这样做的话,我会更加困惑:
项目 = 项目.buildItems()
我得到:
TypeError: buildItems() missing 1 required positional argument: 'self'
我的理解是“自我”总是被暗示的。如果我这样做:
items = Item.buildItems(self)
它显然返回一个"error 'self' is undefined"
。
我只是很困惑,我似乎无法弄清楚这个例子和我最初学习课程时有什么不同。
任何帮助指导我完成此操作将不胜感激,我觉得它会在概念上为我解锁很多。
解决方案
这里有几件事需要考虑:
您的功能
buildItems
不属于您的Item
课程。这意味着调用Item.buildItems()
不起作用。这应该给出错误AttributeError: type object 'Item' has no attribute 'buildItems'
。您提供的错误消息可能是由于缩进实际上不同?__str__(self)
如果您实际上将项目转换为字符串,则将调用您的函数,如下所示:myitems = buildItems() print(str(myitems[0])) # results in '<clock, 175.0, 10.0>'
但是,您正在调用 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))
`
推荐阅读
- android-studio - 如何更改邀请家人和朋友上的共享文本
- reactjs - 通过来自 react-redux 的连接在 React 组件上传递 Typescript 泛型
- c++ - 'main.cpp:1: 没有找到 iostream 的包含路径'
- flutter - Flutter 对 Paragraph 类的宽度度量是什么意思?
- scala - 无限可咖喱添加功能
- javascript - How to populate textInput spacer with hover menu interface
- javascript - 在悬停和灰色背景上显示图像
- javascript - 设置 eval 的范围
- python - 禁止输出以仅显示用法和文档字符串
- php - 将运行时常量值存储在函数区域设置静态变量中以加速多个调用是好还是坏的做法?