【问题标题】:How to put multiple elements inside a class attribute python3如何在类属性python3中放置多个元素
【发布时间】:2015-03-06 07:35:07
【问题描述】:

我正在制作文字广告。我有一个房间类和一个项目类,但是当我在房间内放置多个项目时,我会遇到问题。 下面是代码示例:

class Place(object):
"""The Room class"""
    def __init__(self, name, Item):
        self.name = name
        self.Item = Item


class Item():
"""The Item class"""
    def __init__(self, name):
        self.name = name


PC = Item("PC")
Bed = Item("Bed")   

bedroom = Place(name = "Bedroom", Item = {PC, Bed})

print (bedroom.Item.name)

还有错误信息:

Traceback (most recent call last):
File "C:\Documents and Settings\Kenneth\My Documents\Python_Projects\projects\
TA.Project\location\classes2.py", line 18, in <module>
print (bedroom.Item.name)
AttributeError: 'set' object has no attribute 'name'
Press any key to continue . . .

这在我只有一个项目时有效,但当我尝试添加更多项目时会出错。我试图创建一个 for 循环来一次显示一个项目,但这也不起作用。任何帮助将非常感激。谢谢。

我尝试的循环类似于:

for i in bedroom.Item:
    print (i)

Attributeerror 'Place' 对象没有属性 'Item'

回答已被接受,我想为遇到类似问题的其他人更新代码:

class Place:
    def __init__(self, name: str, items: set):
        self.name = name
        if items is None:
            items = set()   
        self.items = items

    def get_item_names(self):
    # one-liner: return [x.name for x in self.items]
        names = []
        for item in self.items:
            names.append(item.name)
        return '\n'.join(names)


    def get_item_value(self):
        value = []
        for item in self.items:
            value.append(item.value)
            return value


class Item:
    def __init__(self, name: str, value: iter):
        self.name = name
        self.value = value


Bed=Item("Bed", 200)
Chair=Item("Chair", 10)
Oven=Item("Oven", 500)


bedroom = Place("Bedroom", {Bed, Chair})
kitchen = Place("Kitchen", {Oven})


print (bedroom.get_item_names)

values 函数是为了证明 Item 类仍在工作。

【问题讨论】:

  • 你能展示你试过的循环吗?

标签: class python-3.x attributes adventure


【解决方案1】:

不要重用类名作为变量名!这只会混淆并导致错误。 :)

对我来说,它可以与 bedroom.Item 一起使用没有问题,但也许你交换了一些大写/小写字母?!

AttributeError: 'Place' object has no attribute 'Item' 表示您的Place-class 不提供变量Item。因此,如果您实际上将变量命名为 itemItems,您将不得不提出要求而不是 Item


在问题更新之前已经写好了:

当您在一个房间中使用多个项目时,您将不再只有一个特定项目,而是为Place 提供一组项目。因此,在执行bedroom.Item.name 时,您实际上是在要求存储在bedroom.Items 中的set 为您提供name(它没有提供,因此出现错误)。

我会建议一个明确的定义。让Place 总是期待多个项目(也许只有一个,但如果它仍然在一个集合中,那么我的建议仍然有效)。

例子:

class Place:
    def __init__(self, name: str, items: set):
        # The `items: set` notation is only for better understanding.
        # It is valid Python3 syntax, but does not ensure the actual type!
        self.name = name
        if items is None:
            item = set()   # this is to avoid possible erros later.
        self.items = item

    def get_item_names(self):
        # one-liner: return [x.name for x in self.items]
        names = []
        for item in self.items:
            names.append(item.name)
        return names

class Item:
    def __init__(self, name: str):
        self.name = name

bedroom = Place("Bedroom", {Item("Bed"), Item("Chair")})
kitchen = Place("Kitchen", {Item("Oven")})

# usage:
>>> print(bedroom.get_item_names())
["Bed", "Chair"]
>>> print(kitchen.get_item_names())
["Oven"]

主要区别在于使用循环(在get_item_names 中)来获取所有这些名称。 如果您想自己跟踪项目,您仍然可以使用 items-set 进行迭代:

>>> for item in bedroom.items:
...     print(item.name + ":", item)
Bed: <__main__.Item object at 0x7f0c081327f0>
Chair: <__main__.Item obect at 0x7f0c08132898>

【讨论】:

  • 这解决了我的问题。我认为通过在 Place 变量中放置“Item”:Class Place(self, name.Item),我声明只有 Items 可以放在这里。我正在尝试使用列表来代替:“RoomInv[],但无法让它按照我想要的方式工作。我不知道集合是什么,所以我想我无法弄清楚。你是救命稻草。
  • 很高兴听到,它有帮助。我建议再看看 Python 和 Python-Class 介绍。也许事情会变得更容易(对于未来)。 :)
猜你喜欢
  • 2023-03-31
  • 1970-01-01
  • 2016-10-05
  • 2023-03-17
  • 2013-12-20
  • 1970-01-01
  • 2020-05-05
  • 2011-12-24
  • 1970-01-01
相关资源
最近更新 更多