TypeError: __init__() takes 1 positional argument but 2 were given when you instantiate an object of a class and pass more arguments to the constructor (
__init__() method) than it is expecting.
In Python, the instance of the class (
self) is automatically passed as the first argument when calling an instance method.
The exception to this rule are:
- class methods, which get the class instead of the instance as the first argument
- static methods, which don’t get a first argument at all
When you define and instantiate a class as follows:
class Car: def __init__(price): self.price = price # create an instance, pass price my_car = Car(8000)
Python will pass
self, 8000 to the
__init__ method under the hood.
But because you define only
price as the parameter of the method, Python responds with an error:
Traceback (most recent call last): File ... my_car = Car(8000) TypeError: Car.__init__() takes 1 positional argument but 2 were given
To fix this error, you need to add
self parameter to the
class Car: def __init__(self, price): self.price = price my_car = Car(8000) # ✅ print(my_car.price) # 8000
If you don’t need the
self instance, you can declare a static method as shown below:
class Car(): @staticmethod def start(message): print(message) my_car = Car() my_car.start("Start engine!") # or Car.start("Vroom vroom!")
A static method can be called directly from the class without having to create an instance.
Because static methods don’t receive a first argument, the code above runs without any issue.
Finally, this error can happen to any function you declare in your project. Suppose you have an
add() function defined as follows:
def add(x, y): return x + y add(2, 4, 5) # ❌
add() function is defined with two arguments, but 3 arguments were passed when calling that function.
As a result, Python raises another error:
Traceback (most recent call last): File ... add(2, 4, 5) TypeError: add() takes 2 positional arguments but 3 were given
Depending on what you want to achieve, you can either add another argument to the function definition, or you can remove the third argument from the function call.
To summarize, the message
takes 1 positional argument but 2 were given means a method or function expects only 1 argument, but you are passing two.
If this error appears when calling the
__init__ method, it’s likely that you forget to define the
self argument, which is passed to the method implicitly.
To solve the error, add the
self argument to the
__init__ method as shown in this article.