8

I am trying to access a class variable in an outside function, however I get the AttributeError, "Class has no attribute" My codes looks something like this:

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

def notaclass():
    print example.somevariable

AttributeError: class example has no attribute 'somevariable'

Other questions have been asked similar to this however all the answers said to use self and define during init, which I did. Why can't I access this variable.

2
  • 2
    self.somevariable is an instance variable, not a class variable. Commented May 21, 2013 at 22:01
  • To understand this, you have to realize that the example class is an object, but it's of type type, not of type example. Each instance of the example class that you create with, e.g., inst = example() is an object of type example. Your code creates a somevariable attribute in each object of type example. Commented May 21, 2013 at 22:08

2 Answers 2

21

If you want to create a class variable, you must to declare it outside any class methods (but still inside the class definition):

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

With this you can now access your class variable.

>> Example.somevariable
'class variable'

The reason why your example isn't working is because you are assigning a value to an instance variable.

The difference between the two is that a class variable is created as soon as the class object is created. Whereas an instance variable will be created once the object has been instantiated and only after they have been assigned to.

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

>> foo = Example()

Here we created an instance of Example, however if we try to access othervariable we will get an error:

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

Since othervariable is assigned inside doSomething - and we haven't called ityet -, it does not exist.

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

__init__ is a special method that automatically gets invoked whenever class instantiation happens.

class Example(object):

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

>> foo = Example()
>> foo.othervariable
'instance variable'
Sign up to request clarification or add additional context in comments.

Comments

16

You're a bit confused on what is a class attribute, and what is not.

  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()

The class variables are always accessible from the class:

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

Likewise, all instances have access to all instance variables:

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

1 Comment

You might also want to show that aclass.somevar1 and inst.somevar2 work on their own.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.