We need to instantiate or call classes in Python before accessing their methods. If we try to access a class method by calling only the class name, we will raise the error “missing 1 required positional argument: ‘self'”.
This tutorial will go through the definition of the error in detail. We will go through two example scenarios of this error and learn how to solve each.
Table of contents
Missing 1 required positional argument: ‘self’
We can think of a class as a blueprint for objects. All of the functionalities within the class are accessible when we instantiate an object of the class.
“Positional argument” means data that we pass to a function, and the parentheses () after the function name are for required arguments.
Every function within a class must have “self” as an argument. “self” represents the data stored in an object belonging to a class.
You must instantiate an object of the class before calling a class method; otherwise, self will have no value. We can only call a method using the class object and not the class name. Therefore we also need to use the correct syntax of parentheses after the class name when instantiating an object.
The common mistakes that can cause this error are:
- Not instantiating an object of a class
- Not correctly instantiating a class
We will go through each of the mistakes and learn to solve them.
Example #1: Not Instantiating an Object
This example will define a class that stores information about particles. We will add a function to the class. Functions within classes are called methods, and the method show_particle prints the name of the particle and its charge.
class Particle: def __init__(self, name, charge): self.name = name self.charge = charge def show_particle(self): print(f'The particle {self.name} has a charge of {self.charge}')
To create an object of a class, we need to have a class constructor method, __init__()
. The constructor method assigns values to the data members of the class when we create an object. For further reading on the __init__
special method, go to the article: How to Solve Python TypeError: object() takes no arguments.
Let’s try to create an object and assign it to the variable muon. We can derive the muon object from the Particle class, and therefore, it has access to the Particle methods. Let’s see what happens when we call the show_particle()
method to display the particle information for the muon.
muon = Particle.show_particle()
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) muon = Particle.show_particle() TypeError: show_particle() missing 1 required positional argument: 'self'
The code fails because we did not instantiate an object of Particle.
Solution
To solve this error, we have to instantiate the object before we call the method show_particle()
muon = Particle("Muon", "-1") muon.show_particle()
If we run the code, we will get the particle information successfully printed out. This version of the code works because we first declared a variable muon, which stores the information about the particle Muon. The particle Muon has a charge of -1. Once we have an instantiated object, we can call the show_particle() method.
The particle Muon has a charge of -1
Note that when you call a method, you have to use parentheses. Using square brackets will raise the error: “TypeError: ‘method’ object is not subscriptable“.
Example #2: Not Correctly Instantiating Class
If you instantiate an object of a class but use incorrect syntax, you can also raise the “missing 1 required positional argument: ‘self’” error. Let’s look at the following example:
proton = Particle proton.show_particle()
The code is similar to the previous example, but there is a subtle difference. We are missing parentheses! If we try to run this code, we will get the following output:
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) proton.show_particle() TypeError: show_particle() missing 1 required positional argument: 'self'
Because we are missing parentheses, our Python program does not know that we want to instantiate an object of the class.
Solution
To solve this problem, we need to add parentheses after the Particle class name and the required arguments name and charge.
proton = Particle("proton", "+1") proton.show_particle()
Once the correct syntax is in place, we can run our code successfully to get the particle information.
The particle proton has a charge of +1
Summary
Congratulations on reading to the end of this tutorial. The error “missing 1 required argument: ‘self'” occurs when you do not instantiate an object of a class before calling a class method. You can also raise this error if you use incorrect syntax to instantiate a class. To solve this error, ensure you instantiate an object of a class before accessing any of the class’ methods. Also, ensure you use the correct syntax when instantiating an object and remember to use parentheses when needed.
To learn more about Python for data science and machine learning, go to the online courses page for Python.
Have fun and happy researching!
Suf is a senior advisor in data science with deep expertise in Natural Language Processing, Complex Networks, and Anomaly Detection. Formerly a postdoctoral research fellow, he applied advanced physics techniques to tackle real-world, data-heavy industry challenges. Before that, he was a particle physicist at the ATLAS Experiment of the Large Hadron Collider. Now, he’s focused on bringing more fun and curiosity to the world of science and research online.