TypeError:__init__() takes 1 positional argument but 2 were given

The error message TypeError: __init__() takes 1 positional argument but 2 were given usually occurs when we try to instantiate a class and pass one additional argument while the __init__() method (the constructor) of that class is defined to take only one argument.

The error message

Now let’s analyze the error message:

  • The constructor method in a Python class, __init__(), is responsible for initializing the class instance.

  • The constructor is defined to take a single argument, as shown by the notation 1 positional argument.

  • 2 were given indicates that we are attempting to use two arguments to create an instance of the class.

Here’s a quick example to help us understand this problem:

class SampleClass:
def __init__(self):
pass
classObj = SampleClass(1) # This will raise the TypeError

According to the error message, the __init__() method receives two arguments, but we only pass the number 1 as an argument. This is because the interpreter reads the statement classObj = SampleClass(1) as SampleClass.__init__(classObj, 1). So, a total of two arguments are being passed in this case.

When we create an instance of SampleClass, Python automatically passes the instance itself as the first argument. Most methods do some work with the object they are called on. To reference the object within the method, a common convention is to use the parameter named self as the first argument inside the function definition.

Possible solutions

We must ensure that the number of arguments we provide when creating a class instance equals the number of parameters specified in the __init__() method in order to resolve this error.

Instantiating SampleClass with no extra arguments

To resolve the error, we can instantiate SampleClass without passing any additional argument:

class SampleClass:
def __init__(self):
print("In __init__ method.")
classObj = SampleClass()

Modifying the __init__() method to accept two arguments

We can also fix the issue by modifying __init__() method to accept two arguments, as shown in the example below:

class SampleClass:
def __init__(self, arg1):
self.arg1 = arg1
classObj = SampleClass(1)

Using the @staticmethod decorator

Apart from this, we can use the @staticmethod decorator to prevent from passing the instance itself as the first argument:

class SampleClass:
@staticmethod
def __init__(self):
print(self)
classObj = SampleClass(1)

Free Resources

Copyright ©2024 Educative, Inc. All rights reserved