【发布时间】:2018-06-22 05:12:05
【问题描述】:
我想确保hotel_name 不存在于Hotel.hotels 列表中。
似乎当我开始喂食时,每次 for 循环都在一个空列表中查找。
请注意,如果我不使用 for 循环并且只使用
Hotel.hotels.append([number,hotel_name,city,total_number,empty_rooms])
它打印酒店列表
[[1, 'Crown Plaza', 'alex', 20, 2], [1, 'Crown Plaza', 'alex', 20, 2], [2, 'Radisson Blu', 'cairo', 24, 22], [3, 'Paradise Inn', 'dubai', 390, 200], [4, 'Four Seasons', 'alex', 1000, 400], [5, 'Address', 'dubai', 500, 200], [6, 'Fairmont', 'dubai', 1000, 100], [7, 'Rotana', 'dubai', 5000, 300]]
[Finished in 0.1s]
这是文件
class Hotel():
"""""""""
this is hotel class file
"""
hotels = []
def __init__(self,number,hotel_name,city,total_number,empty_rooms):
self.number = number
self.hotel_name = hotel_name
self.city = city
self.total_number = total_number
self.empty_rooms = empty_rooms
for i in Hotel.hotels:
if self.hotel_name not in i:
Hotel.hotels.append([number,hotel_name,city,total_number,empty_rooms])
# else:
# print "Hotel already exists!"
feed_dataBase_with_hotel = Hotel(1,"Crown Plaza","alex",20,2)
feed_dataBase_with_hotel = Hotel(1,"Crown Plaza","alex",20,2)# cull repeated
feed_dataBase_with_hotel = Hotel(2,"Radisson Blu","cairo",24,22)
feed_dataBase_with_hotel = Hotel(3,"Paradise Inn","dubai",390,200)
feed_dataBase_with_hotel = Hotel(4,"Four Seasons","alex",1000,400)
feed_dataBase_with_hotel = Hotel(5,"Address","dubai",500,200)
feed_dataBase_with_hotel = Hotel(6,"Fairmont","dubai",1000,100)
feed_dataBase_with_hotel = Hotel(7,"Rotana","dubai",5000,300)
print Hotel.hotels
非常感谢 Patrick 的回答 更新 如果我想从字典中构建一个列表怎么办,因为我想访问空房间并用另一个类更改它的值
class Hotel():
"""
this is hotel class file
"""
hotels = {}
hotelList = []
def __init__(self,number,hotel_name,city,total_number,empty_rooms):
self.number = number
self.hotel_name = hotel_name
self.city = city
self.total_number = total_number
self.empty_rooms = empty_rooms
# edited: no for needed
if self.hotel_name in Hotel.hotels:
print('Hotel {} Already exists!'.format(self.hotel_name))
return # or raise ValueError & handle it
Hotel.hotels[self.hotel_name] = self
tempList = Hotel.hotels.items()
for i in tempList:
x = Hotel.hotels.items()[i][1]
Hotel.hotelList.append(x)
更新
另一个预订类将使用我们在酒店类中使用的实例变量hotel_name
from hotel import Hotel
from customer import Customer
from notification import Notification
class Reservation():
reservations =[]
def reserve_room(self,hotel_name, customer_name):
x = Hotel.hotels.values()
for i in x:
if Hotel.hotel_name in i:
Reservation.reservations.append([hotel_name,customer_name])
i[4] -=1
AttributeError: class Hotel 没有属性'hotel_name'
更新 来自Understanding getitem method 使用
def __getitem__(self, hotel_name):
return self.hotel_name
问题已解决!
特别感谢Patrick
【问题讨论】:
-
如果你把
Hotel实例扔掉,为什么还要创建它们?您只在feed_dataBase_with_hotel中存储了最后一个“Hotel”。Hotel.hotels仅存储酒店属性的简单列表,NOT 您刚刚创建的酒店实例。因此,您可以立即创建并忘记它。如需修复,请参阅答案。 -
@PatrickArtner 感谢您的回答,您介意查看我的更新吗?
-
我编辑了 - for 循环是多余的 -
if self.hotel_name in Hotel.hotels已经检查了 all 键。tempList和额外的hotelList也是多余的 - 而不是返回(key,value)元组的dict.items()只需使用Hotel.hotels.values()即可返回所有酒店实例,而无需密钥。 hth -
再次感谢您的精彩回答!不好意思说还有最后一个更新,请检查一下
-
你的
i是一个Hotel实例——我认为你应该在谷歌上搜索一下实例和类。您的x是您获得的所有酒店实例,如果您是for i in x:,那么i将依次是每个酒店实例。因此,要将酒店名称添加到预订中,请执行以下操作:Reservations.reservations.append([i.hotel_name, customer_name])... 请停止添加此问题,因为“价值”会随着每个问题的堆积而减少。最好提出一个新问题。
标签: python list class for-loop class-variables