Thomas Nicholls
Thomas Nicholls

Reputation: 21

how to solve attribute error when all attributes do exist?

I am writing a program for my A level course in python and i need to access an attribute from one class in to another using inheritance. here is an example of what I am trying to do.

class class1():
    def __init__(self):
        self.testValue = 'hello'

class class2(class1):
    def __init__(self):
        self.inheritedValue = class1.testValue
        print(self.inheritedValue)



object = class2()

when running this code i get the following attribute error.

AttributeError: type object 'class1' has no attribute 'testValue'

anyone got a solution for this??

Upvotes: 1

Views: 1658

Answers (2)

Alexander Ejbekov
Alexander Ejbekov

Reputation: 5960

The attribute does not exist within the scope of class2 the way you've implemented it. By passing it in the class definition, it is inherited but the attribute doesn't exist yet. That is, unless you've called the constructor. Two ways of doing this, by either using the super built-in function(not recommended in real life, see here, it's a nice read. Anyway, here are a few solutions:

class class1():
    def __init__(self):
        self.testValue = 'hello'

class class2(class1):
    def __init__(self):
        class1.__init__(self)        
        print(self.testValue)



obj = class2()

if you do not want to call the constructor of the class you are inheriting, you could do something like this:

class class1():
    testValue = 'hello'
    def __init__(self):
        pass

class class2(class1):
    def __init__(self):
        self.inheritedValue = class1.testValue
        print(self.inheritedValue)

obj = class2()

Side note, object is a built-in so you shouldn't use it.

Upvotes: 0

glglgl
glglgl

Reputation: 91119

First a comment to code style: class names are written in CamelCase, so name them Class1 and Class2.

Secondly, your class Class1 doesn't have the said attribute, but each instance does.

So your class2 should look like

class Class2(Class1):
    def __init__(self):
        super().__init__() # now we have everything Class1 provides us with
        self.inheritedValue = self.testValue
        print(self.inheritedValue)

because each object of Class2 is also an object of Class1

Upvotes: 2

Related Questions