__getitem__ and __setitem__ in Python


Have you ever considered how Python's magic methods make our lives as programmers less complicated, almost as if we've got a helpful buddy guiding us along the way? In this article, we're going to explore Python's magic methods, getitem, and setitem, unraveling their mysteries and coming across how they are able to assist us to write extra expressive, human-friendly code. Let's dive in!

Understanding Magic Methods

Magic methods, additionally called "dunder" methods (short for "double underscore"), are unique strategies in Python classes that have double underscores at the beginning and cease of their names. They permit us to define how our classes ought to behave in positive situations, like when we want to get the right of entry to or regulate their factors. Two of these magic methods are getitem and setitem, which might be used to define how we retrieve and regulate the factors of a custom magnificence.

The Magic of Getitem

The getitem magic method allows us to define how to access elements of a custom class using the square bracket notation, just like we would with lists, dictionaries, or other built-in Python objects. When we define a class with a getitem method, we can access its elements using the familiar syntax −

element = my_instance[index]

Here's an example of a simple custom class called MyList, which simulates a basic list using the getitem magic method −

Step 1  Define the MyList class with a constructor (__init__) that takes a list as input and feeds it inside the data attribute.

Step 2  Implement the __getitem__ magic approach, which takes an index as an argument and returns the element from the data attribute at the given index.

Step 3  Create an example of MyList with a listing of numbers from 1 to 5.

Step 4  Print the element at index 1 using the square bracket notation. The output will be 2.

Example

class MyList:
   def __init__(self, data):
      self.data = data

   def __getitem__(self, index):
      return self.data[index]

my_list = MyList([1, 2, 3, 4, 5])
print(my_list[1])  

Output

2

The Enchantment of Setitem

Now that we've explored getitem, let's take a look at its counterpart, setitem. The setitem magic method allows us to define how to modify elements of a custom class using the square bracket notation. When we define a class with a setitem method, we can modify its elements like this −

my_instance[index] = new_value

Let's expand our previous MyList example to include the setitem magic method −

Step 1  Characterize the MyList class with a constructor (__init__) that takes a listing as input and stores it inside the data attribute.

Step 2  Implement the __getitem__ magic method, which takes an index as an argument and returns the detail from the data characteristic at the given index.

Step 3  Execute the __setitem__ magic method, which takes an index and a price as arguments, and relegates the cost to the thing inside the data characteristic on the given index.

Step 4  Make an instance of MyList with a listing of numbers from 1 to 4.

Step 5  Print the element at index 1 using the square bracket notation. The output will be 2.

Step 6 − Modify the element at index 1 by assigning a new value (42) using the square bracket notation. The __setitem__ method will handle the modification.

Step 7  Print the element at index 1 again using the square bracket notation. Due to the modification in Step 6, the output will now be 42.

Example

class MyList:
   def __init__(self, data):
      self.data = data

   def __getitem__(self, index):
      return self.data[index]

   def __setitem__(self, index, value):
      self.data[index] = value

my_list = MyList([1, 2, 3, 4, 5])
print(my_list[1])  # Output: 2

my_list[1] = 42
print(my_list[1]) 

Output

2
42

Best Practices for Using Getitem and Setitem

Now that we understand the magic of getitem and setitem, let's review some best practices for using these methods to create more human-friendly code −

  • Make your code intuitive  When using getitem and setitem, aim for intuitive behavior that resembles built-in Python objects like lists, dictionaries, or arrays. This will make your custom classes more approachable and easier to understand.

  • Handle edge cases gracefully  Be prepared to handle edge cases, such as invalid indices or keys. You can raise appropriate exceptions, like IndexError for invalid indices or KeyError for invalid keys, to inform users about the issue.

  • Use clear variable names  When defining your getitem and setitem methods, use clear and descriptive variable names for indices and values. This will make your code more readable and less difficult to manage.

  • Don't forget about slicing  Consider supporting slicing operations in your getitem and setitem methods, making your custom classes even more versatile and convenient to work with.

  • Stay consistent  If your class implements both getitem and setitem, ensure their behavior remains consistent. For instance, if your getitem method supports negative indices, your setitem method should do the same.

Conclusion

In this article, we've explored the magical world of getitem and setitem magic methods. These powerful tools enable us to create custom classes with intuitive and familiar behavior, mimicking built-in Python objects and making our code more expressive and human-friendly.

By following the best practices we've discussed, you'll be able to harness the power of getitem and setitem to create custom classes that feel like second nature to your fellow programmers, fostering collaboration and understanding. So go ahead and spread the magic of getitem and setitem throughout your Python projects, creating code that's as enchanting as it is functional. Happy coding!

Updated on: 09-May-2023

1K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements