Python Classes ( AttributeError: '' object has no attribute '')

36,201

Solution 1

Edit:
Your code works fine!
What is the Problem?

I still think it is better to move self4 into the init!

Original
I think the most logical thing would be to define self4 on init:

class className(object):
    def __init__(self, self1=1, self2=2, self3=3):
        self.self1 = self1
        self.self2 = self2
        self.self3 = self3
        self.self4 = None

   #rest of class

Solution 2

If anyone still has this issue: you get this error when your indentation is goofed.To fix the asked question above, you just have to add a space before the last two functions definitions, that is; class className(object):

def __init__(self, self1=1,self2=2,self3=3):
    self.self1=self1
    self.self2=self2
    self.self3=self3

def evaluate(self, self5):
    
    print className.func1(self) + className.func2(self)
    self.self5=self5
    print className.func1(self)

def func1(self):
    return self.self1 + self.self5

def func2(self):
    self.self4 = self.self1+self.self2+self.self3
    return self.self4

just make sure they all have similar indentation, and you are good to go.

Share:
36,201
William Baker Morrison
Author by

William Baker Morrison

Computing Lecturer and Data Scientist based in Berlin, primarily coding in Python on Linux. Focus on unsupervised time-series analysis, machine learning and anomaly detection.

Updated on April 18, 2021

Comments

  • William Baker Morrison
    William Baker Morrison about 3 years

    Having trouble understanding the problem in my code, new to classes (generally python too, so sorry if I name things wrong). I receive this error:

    I think my code is too long winded to include in here, so I made a simplified version to test the concept below.

    The question is, how can I create a new self object "self4"? Which would then be available to other functions within the class. Currently I get this error.

    AttributeError: 'className' object has no attribute 'self4'

    class className(object):
    
       def __init__(self, self1=1,self2=2,self3=3):
            self.self1=self1
            self.self2=self2
            self.self3=self3
    
       def evaluate(self, self5):
            print className.func1(self) + className.func2(self)
            self.self5=self5
            print className.func1(self)
    
       def func1(self):
           return self.self1 + self.self5
    
       def func2(self):
           self.self4 = self.self1+self.self2+self.self3
           return self.self4
    

    filename tester.py

    import tester.py
    
    mst=tester.className()
    
    mst.evaluate()
    
    • falsetru
      falsetru over 8 years
      Why don't you call self.func2() in __init__ ?
    • William Baker Morrison
      William Baker Morrison over 8 years
      I've added how I call this code. I want to be able to call evaluate for different conditions e.g. self1=4 and self1 = 3.
    • Pandrei
      Pandrei over 8 years
      I just ran the code in your question and it works fine....it prints 7 6. The question is not valid...
  • JDurstberger
    JDurstberger over 8 years
    Indeed it does, tried it right now. So there is basically no error and therefore no question?!