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 - 你不必在代码中寻找重复)。