В этом примере он работает в качестве переменной класса 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: глобальное имя "клиенты" не определено
Обновить
для первого примера ничего не вызвало, чтобы показать ошибку, но проблема решена для второго примера. Спасибо, Том Далтон, шорт и Джеймс
Как я сказал в своем комментарии, когда вы вызываете 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:
Я думаю, что очень вероятно, что когда вы запустили свой первый пример, у вас была переменная, называемая гостиницами в вашем глобальном (интерпретаторе) пространстве. Вот почему он работает. Если я скопирую ваш пример в мой интерпретатор, он не с тем же сообщением об ошибке, что и ваш второй образец кода.
Если ваша функция send_text_message имеет доступ только к переменным класса (без переменных экземпляра), я бы рекомендовал сделать это методом класса следующим образом:
@classmethod
def send_text_message(cls, customer_name):
for i in cls.customers:
print "triggeredb"
Таким образом, вы можете получить доступ к переменным класса, используя переменную cls, и вам не придется повторять имя класса в вашей функции (что приятно, как если бы вы изменили имя класса), вам не нужно будет искать ваш код через свой код для повторы).