Ghost
Ghost

Reputation: 3

AttributeError: object has no attribute (Exmple from book "Python CRASH COURSE")

I just started learning python few days ago, and the book I read is "Python CRASH COURSE"

I don't know what I missed in this code, please help me!

class mathfunctions:
  def addition(self,num1,num2):
      return num1+num2
  def subtraction(self,num1,num2):
      return num1-num2
  def multiply(self,num1,num2):
      return num1*num2
  def divide(self,num1,num2):
      return num1/num2
class actiondeclarer():
  action = None
  x = None
  y = None
  functions = mathfunctions()
  def __init__(self,actionnum,num1,num2):
      self.action = actionnum
      self.x = num1
      self.y = num2
      self.actionpicking()
      def actionpicking(self):
         if self.action is 1:
             print("sum is ",self.functions.addition(self.x,self.y))
         elif self.action is 2:
             print("difference is ",self.functions.subtraction(self.x,self.y))
         elif self.action is 3:
             print("multitude is ",self.functions.multiply(self.x,self.y))
         elif self.action is 4:
             print("divide is ",self.functions.divide(self.x,self.y))
         else:
            print("invalid")

checker = actiondeclarer(1,5,10)

the error message is AttributeError: 'actiondeclarer' object has no attribute 'actionpicking'

By the way, if the code were correct, the result "sum is 15" can be shown without typing print(checker), right?

Upvotes: 0

Views: 197

Answers (1)

Silvio Mayolo
Silvio Mayolo

Reputation: 70297

Your indentation is off.

def __init__(self,actionnum,num1,num2):
  # Code
  self.actionpicking()
  def actionpicking(self):
     # Code

This defines a closure locally within __init__. You want actionpicking's indentation level to match that of __init__.

def __init__(self,actionnum,num1,num2):
  # Code
  self.actionpicking()
def actionpicking(self):
  # Code

Upvotes: 2

Related Questions