如何将多个元素放入 class 属性 python3
How to put multiple elements inside a class attribute python3
我正在做文字冒险。我有一个房间 class 和一个项目 class,但是当我在房间内放置多个项目时,我遇到了问题。
这是代码示例:
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)
价值函数是为了证明项目 class 仍然有效。
不要重复使用 class 名称作为变量名称!这只会混淆并导致错误。 :)
对我来说,它与 bedroom.Item
一起使用没有问题,但也许你交换了一些 upper-/lowercase 个字母?!
AttributeError: 'Place' object has no attribute 'Item'
表示您的Place
-class没有提供变量Item
。因此,如果您实际上将变量命名为 item
或 Items
,您将不得不要求它而不是 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>
我正在做文字冒险。我有一个房间 class 和一个项目 class,但是当我在房间内放置多个项目时,我遇到了问题。 这是代码示例:
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)
价值函数是为了证明项目 class 仍然有效。
不要重复使用 class 名称作为变量名称!这只会混淆并导致错误。 :)
对我来说,它与 bedroom.Item
一起使用没有问题,但也许你交换了一些 upper-/lowercase 个字母?!
AttributeError: 'Place' object has no attribute 'Item'
表示您的Place
-class没有提供变量Item
。因此,如果您实际上将变量命名为 item
或 Items
,您将不得不要求它而不是 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>