类变量NameError未定义python

时间:2018-06-20 14:26:01

标签: python class-variables

在此示例中,它正在工作 酒店作为类变量,没有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

2 个答案:

答案 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变量访问类变量,而不必在函数中重复类名(这很好,就像您更改类名一样-您不必遍历所有您的重复代码)。