Class 未定义变量 NameError python
Class Variable NameError not defined python
在此示例中,它正在运行
酒店作为 class 变量没有 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: 全局名称 'customers' 未定义
更新
对于第一个例子,没有调用显示错误
但是第二个例子的问题已经解决了 谢谢 Tom Dalton , scharette 和 James
正如我在评论中所说,当您调用 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:
我认为当您 运行 您的第一个示例时,您的全局(解释器)范围内有一个名为 hotels 的变量。这就是它起作用的原因。如果我将您的示例复制粘贴到我的解释器中,它会失败并显示与您的第二个代码示例相同的错误消息。
如果您的 send_text_message 函数仅访问 class 变量(无实例变量),我建议将其设为 class 方法,如下所示:
@classmethod
def send_text_message(cls, customer_name):
for i in cls.customers:
print "triggeredb"
这样您就可以使用 cls 变量访问 class 变量,而不必在您的函数中重复 class 名称(这很好,就像您更改 class name - 你不必在代码中寻找重复)。
在此示例中,它正在运行 酒店作为 class 变量没有 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: 全局名称 'customers' 未定义
更新
对于第一个例子,没有调用显示错误 但是第二个例子的问题已经解决了 谢谢 Tom Dalton , scharette 和 James
正如我在评论中所说,当您调用 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:
我认为当您 运行 您的第一个示例时,您的全局(解释器)范围内有一个名为 hotels 的变量。这就是它起作用的原因。如果我将您的示例复制粘贴到我的解释器中,它会失败并显示与您的第二个代码示例相同的错误消息。
如果您的 send_text_message 函数仅访问 class 变量(无实例变量),我建议将其设为 class 方法,如下所示:
@classmethod
def send_text_message(cls, customer_name):
for i in cls.customers:
print "triggeredb"
这样您就可以使用 cls 变量访问 class 变量,而不必在您的函数中重复 class 名称(这很好,就像您更改 class name - 你不必在代码中寻找重复)。