Переменная класса NameError не определена python

1

В этом примере он работает в качестве переменной класса no 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: глобальное имя "клиенты" не определено

Обновить

для первого примера ничего не вызвало, чтобы показать ошибку, но проблема решена для второго примера. Спасибо, Том Далтон, шорт и Джеймс

Теги:
class-variables

2 ответа

1
Лучший ответ

Как я сказал в своем комментарии, когда вы вызываете for я in customers: customers не входят в эту функцию.

Я просто хотел добавить, что вы используете

 Notifications.customers.append([customer_name,number,message])

но вы также заявляете

customers = []

Обратите внимание, что первая является переменной класса и будет делиться переменной среди экземпляров Notifications. Последние представляют собой переменную экземпляра. Если ваша цель состоит в том, чтобы иметь список customers для каждого конкретного объекта, вы должны использовать self.customers.

Таким образом,

Вам нужен общий список между объектами?

for i in Notifications.customers:

Вам нужен конкретный список для каждого объекта?

for i in self.customers:
  • 0
    Спасибо за ваш четкий ответ, ценится!
  • 0
    Вы можете объяснить, почему он работает в первом примере без Hotel.hotels или self.hotels
Показать ещё 6 комментариев
1

Я думаю, что очень вероятно, что когда вы запустили свой первый пример, у вас была переменная, называемая гостиницами в вашем глобальном (интерпретаторе) пространстве. Вот почему он работает. Если я скопирую ваш пример в мой интерпретатор, он не с тем же сообщением об ошибке, что и ваш второй образец кода.

Если ваша функция send_text_message имеет доступ только к переменным класса (без переменных экземпляра), я бы рекомендовал сделать это методом класса следующим образом:

@classmethod
def send_text_message(cls, customer_name):
    for i in cls.customers:
        print "triggeredb"

Таким образом, вы можете получить доступ к переменным класса, используя переменную cls, и вам не придется повторять имя класса в вашей функции (что приятно, как если бы вы изменили имя класса), вам не нужно будет искать ваш код через свой код для повторы).

  • 0
    Спасибо за ваше уведомление, но я пытаюсь подтвердить, что это приведет к ошибке в другой глобальной области интерпретатора, но это не ошибка !!
  • 0
    Проверьте в местных жителей () может быть? Или вы могли бы это определить на уровне модуля?
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню