在此示例中,它正在工作 酒店作为类变量,没有NameError
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
Hotel.hotels.append([number,hotel_name,city,total_number,empty_rooms])
def list_hotels_in_city(self,city):
for i in hotels:
if city in i:
print "In ",city,": ",i[1],"hotel, available rooms :",i[4]
在下面的示例中,它不起作用
from twilio.rest import Client
class Notifications():
customers = []
def __init__(self,customer_name,number,message):
self.customer_name = customer_name
self.number = number
self.message = message
Notifications.customers.append([customer_name,number,message])
def send_text_message(self,customer_name):
for i in customers:
print "triggeredb"
inst = Notifications("ahmed","+00000000000","messagesample")
print "instance : ",inst.customers
inst.send_text_message("ahmed")
NameError:未定义全局名称“客户”
更新
第一个例子,没有显示错误 但是第二个例子解决了问题。谢谢scharette和James的Tom Dalton
答案 0 :(得分:1)
正如我在评论中所说,当您调用for i in customers:
时,customers
不在该函数的范围内。
我也想添加您使用的
Notifications.customers.append([customer_name,number,message])
但您还要声明
customers = []
请注意,前者是 class 变量,并将在Notifications
个实例之间共享该变量。后者表示实例变量。如果您的目标是为每个特定对象创建一个customers
列表,则应使用self.customers
。
基本上,
您要在对象之间共享列表吗?
for i in Notifications.customers:
您想要每个对象的特定列表吗?
for i in self.customers:
答案 1 :(得分:1)
我认为运行第一个示例时,很有可能在全局(解释器)范围内有一个名为hotel的变量。这就是为什么它起作用。如果我将您的示例复制粘贴到我的解释器中,它将失败,并显示与第二个代码示例相同的错误消息。
如果您的send_text_message函数仅访问类变量(没有实例变量),我建议将其设置为类似这样的类方法:
@classmethod
def send_text_message(cls, customer_name):
for i in cls.customers:
print "triggeredb"
这样,您可以使用cls变量访问类变量,而不必在函数中重复类名(这很好,就像您更改类名一样-您不必遍历所有您的重复代码)。