2013-05-21 2 views
4

Я пытаюсь получить доступ к переменной класса во внешней функции, тем не менее я получаю AttributeError, «Класс не имеет атрибут» Мои коды выглядит примерно так:функция Python не обращается к классу переменной

class example(): 
    def __init__(): 
      self.somevariable = raw_input("Input something: ") 

def notaclass(): 
    print example.somevariable 

AttributeError: class example has no attribute 'somevariable' 

Другие вопросы были запрошены аналогично этому, однако все ответы говорят, что используют self и определяют во время init, что я и сделал. Почему я не могу получить доступ к этой переменной.

+1

'self.somevariable' - это переменная экземпляра, а не переменная класса. –

+0

Чтобы понять это, вы должны понимать, что класс 'example' является объектом, но он имеет тип' type', а не тип 'example'. Каждый _instance_ класса 'example', который вы создаете с помощью, например,' inst = example() ', является объектом типа' example'. Ваш код создает атрибут 'somevariable' в каждом объекте типа' example'. – abarnert

ответ

12

Если вы хотите создать переменную класса , вы должны объявить его вне методов класса (но все еще внутри определения класса):

class Example(object): 
     somevariable = 'class variable' 

С помощью этого вы можете получить доступ к переменной класса.

>> Example.somevariable 
'class variable' 

Причина, почему ваш пример не работает, потому что вы присваиваете значение к instance переменной.

Разница между двумя заключается в том, что переменная class создается, как только объект класса создается. В то время как переменная instance будет создана после того, как объект был создан и только после того, как они были назначены.

class Example(object): 
     def doSomething(self): 
      self.othervariable = 'instance variable' 

>> foo = Example() 

Здесь мы создали экземпляр Example, однако, если мы попытаемся получить доступ к othervariable мы получим ошибку:

>> foo.othervariable 
AttributeError: 'Example' object has no attribute 'othervariable' 

С othervariable назначенную внутри doSomething - и мы не под названием ityet - , этого не существует.

>> foo.doSomething() 
>> foo.othervariable 
'instance variable' 

__init__ это специальный метод, который автоматически вызывается, когда класс экземпляра происходит.

class Example(object): 

     def __init__(self): 
      self.othervariable = 'instance variable' 

>> foo = Example() 
>> foo.othervariable 
'instance variable' 
+0

Теперь я вижу. И это работает сейчас. Спасибо – sommerjj

+0

Красивый ответ. Спасибо, Карлос! – Siyah

10

Вы немного смущены тем, что является атрибутом класса, а что нет.

class aclass(object): 
     # This is a class attribute. 
     somevar1 = 'a value' 

     def __init__(self): 
      # this is an instance variable. 
      self.somevar2 = 'another value' 

     @classmethod 
     def usefulfunc(cls, *args): 
      # This is a class method. 
      print(cls.somevar1) # would print 'a value' 

     def instancefunc(self, *args): 
      # this is an instance method. 
      print(self.somevar2) # would print 'another value' 

    aclass.usefulfunc() 
    inst = aclass() 
    inst.instancefunc() 

Класс переменных всегда доступны из класса:

print(aclass.somevar1) # prints 'a value' 

Кроме того, все экземпляры имеют доступ ко всем переменным экземпляра:

print(inst.somevar2) # prints 'another value' 
+1

Возможно, вы также захотите показать, что 'aclass.somevar1' и' inst.somevar2' работают самостоятельно. – abarnert