2014-10-20 4 views
1

Я пару раз играю со сценариями и не имею никаких проблем, но теперь я пытаюсь создать класс и сталкиваюсь с проблемами.NameError при инициализации экземпляра класса

Я не совсем понимаю это сам, но я получаю эту ошибку NameError: global name 'instance_status_check' is not defined, когда пытаюсь создать экземпляр следующего класса.

Я полностью осознаю, что в данный момент класс не очень много работает, но я не могу двигаться дальше, пока не решит проблему. Может кто-нибудь объяснить, что я делаю неправильно?

import sys 
import boto 
import boto.ec2 

class Monitor: 

    def __init__(self,conn,identifier): 
     self.connection = conn 
     self.identifier = identifier 
     self.dispatcher ={'1': instance_status_check} 

    def user_menu(): 
     for i, value in self.dispatcher.itertems(): 
      print "Please press {i} for {value}".format(i,value) 

    def instance_status_check(): 
     pass  
+0

Что вы назначаете в качестве значения для этого словаря 'dispatcher'? – squiguy

+0

Я собираюсь использовать его для создания пользовательского меню - то есть вызова диспетчера ['1']() для вызова функции instance_status_check – user2983542

ответ

2

Вы пропускаете параметр self от обоих методов, и это iteritems не :

class Monitor: # upper case for class names 
    def __init__(self,conn,identifier): 
     self.connection = conn 
     self.identifier = identifier 
     self.dispatcher ={'1': self.instance_status_check} # call self.instance_status_check() 

    def user_menu(self): # self here 
     for i, value in self.dispatcher.iteritems(): 
      print("Please press {i} for {value}".format(i,value)) 

    def instance_status_check(self): # self here 
     return "In status method" 

m = Monitor(3,4) 
print(m.dispatcher["1"]()) 
In status method 

Предлагаю вам ознакомиться с учебник по классам из docs

+0

Это работает, но не то, что я надеялся сделать со значением словаря, я надеялся создать пользовательское меню и вызвать, например, диспетчер ['1'](), чтобы вызвать функцию instance_status_check – user2983542

+0

Я отредактировал, чтобы удалить parens, вы должны взглянуть на методы класса, если хотите разделить dict между экземплярами класса –

+0

Спасибо, что работает, можете ли вы объяснить, почему мне нужно «я». перед вызовом функции? Спасибо – user2983542

0

Вы эту ошибку, потому что вы определили instance_status_check после того как вы уже используете его.

Переместить объявление выше класса:

def instance_status_check(): 
    pass 

class monitor: 

    def __init__(self,conn,identifier): 
     self.connection = conn 
     self.identifier = identifier 
     self.dispatcher ={'1': instance_status_check} 

    def user_menu(self): 
     for i, value in self.dispatcher.itertems(): 
      print "Please press {i} for {value}".format(i,value) 

Кроме того, это не будет печатать Please press 1 for instance_status_check он будет печатать что-то вроде Please press 1 for <function instance_status_check at 0xsomething>

+0

Так что в обычных обстоятельствах то, что я делал, не было бы проблемой? Например, для словаря было другое значение? Спасибо – user2983542

Смежные вопросы