编辑:这被标记为一个重复,因为我询问如何正确打印类项目。这是我的问题的一部分,是的,但我对对象实例的交互和一般引用事物的方式比较困惑。这很有帮助。另外,我本来应该这样做的,但是我已经包括了MITx(在线mooc)的解决方案,用于创建我一直在学习的0/1背包问题的“包”。这可能更清楚地说明了他们为什么像这样编写class
和buildItems
函数。你知道吗
我现在已经阅读了大量的教程,试图理解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)
中,但如果这样做,会让我更加困惑:
项目=Item.buildItems项目()
我得到:
TypeError: buildItems() missing 1 required positional argument: 'self'
我的理解是“自我”总是隐含的。如果我这样做:
items = Item.buildItems(self)
它显然返回一个"error 'self' is undefined"
。你知道吗
我只是很困惑,我似乎不知道这个例子和我最初学习课程的时候有什么不同。你知道吗
任何帮助引导我通过这将是非常感谢,我觉得这将解锁很多概念上为我。你知道吗
您已经在路上了,并且已经定义了一个
__str__(self)
方法。这将覆盖默认的object__str__
方法。因此,每当您打印项目时,它都会以您定义的格式打印,实际上,每当您尝试以字符串方式使用类时,它都会调用此方法。你知道吗但是,当您将它们放在列表中并打印列表时,对象表示将调用
__repr__
方法。这通常意味着表示如何创建这个实例,但可以是任何你喜欢的东西。你知道吗如果您想返回相同的字符串表示形式,您可以
如果你想让你的输出像你在问题中展示的那样看起来像一个列表
如果你想把你的类表示成它被构造的样子
输出
因此,您需要重写
__repr__
方法,但它如何呈现自己实际上取决于您。你知道吗这里需要考虑以下几点:
函数
buildItems
不是Item
类的一部分。这意味着调用Item.buildItems()
不起作用。这将产生错误AttributeError: type object 'Item' has no attribute 'buildItems'
。您提供的错误消息可能是因为缩进实际上是不同的?如果您实际将项目转换为字符串,则会调用函数
__str__(self)
,如下所示:但是,您正在调用print到对象列表,在那里
__repr__(self)
函数将用于为列表中的每个元素生成一个字符串。因此,您需要重写__repr__(self)
函数,如下所示:编辑:
这将产生您想要的输出。然而,这与@ShadowRanger在评论中提到的
__repr__
函数背后的意图不一致。通过复制粘贴到终端中实现输出的更好方法如下:`
相关问题 更多 >
编程相关推荐