AlgoMaster Logo

@property Decorator

Last Updated: January 3, 2026

5 min read

Understanding how to effectively use the @property decorator in Python can transform the way you interact with your class attributes. It allows you to define methods in a way that they can be accessed like attributes, blending the functionality of method calls with the simplicity of attribute access.

This can help maintain encapsulation while keeping your code clean and readable.

What is the @property Decorator?

The @property decorator is a built-in feature in Python that allows you to define a method as a property. Essentially, it lets you create getters, setters, and deleters for a class attribute, enabling you to control access and modification while keeping a clean interface.

When you use @property, you're turning a method into an attribute, which means you can access it without parentheses. This makes your code feel more intuitive and object-oriented. Instead of calling obj.get_value(), you can simply use obj.value.

Basic Example

Let’s start with a simple example to illustrate how @property works:

In this example, we defined a Circle class where the radius attribute is accessed through a property method. This allows us to include validation in the setter method, ensuring that the radius cannot be negative.

Benefits of Using @property

There are several advantages to using @property that can enhance your coding practices:

Encapsulation

By using @property, you can keep your internal data representation private. This prevents direct access to attributes, allowing you to add validation or transformation logic in the getter or setter.

Reducing Boilerplate

Using properties can reduce the need for explicit getter and setter methods, making the code cleaner and easier to read:

Computed Properties

You can use @property to create computed properties, which can derive values based on other attributes:

The area property here calculates the area dynamically based on the rectangle's width and height.

Setting Up Read-Only Properties

Sometimes, you might want a property that can only be read and not modified. This can be achieved by defining only the getter:

In this example, we provide a read-only celsius property and a computed fahrenheit property derived from it. This is useful when you want to expose data without allowing it to be modified directly.

Handling Deletions with @property

You can also handle deletions by using the @property decorator in combination with the @<property_name>.deleter decorator. This is useful when you want to control how an attribute is deleted.

Here, the connection property lazily creates a database connection if it doesn't already exist, and the deleter handles closing it properly when necessary.

Common Pitfalls and Best Practices

While using @property is powerful, there are some common pitfalls and best practices to keep in mind:

Pitfall: Overusing Properties

It's tempting to use properties everywhere, but not every simple attribute needs a property. If the logic in your getter or setter is trivial, consider using direct attribute access for clarity.

Best Practice: Naming Conventions

Use clear and descriptive names for your properties. This helps maintain readability and understanding in your codebase. For instance, current_temperature is much clearer than just temperature.

Pitfall: Performance Considerations

Keep in mind that if your property performs expensive calculations, it will be recalculated every time you access it. If the result remains constant, consider caching it.

Best Practice: Document Your Properties

Always document what your properties do, especially if they have side effects or validation. This helps future developers (or your future self) understand the intent behind the code.

Now that you understand how to use the @property decorator to create clean, manageable access to your class attributes, you are ready to explore getters and setters in more detail.

In the next chapter, we will delve deeper into how to implement effective getters and setters, their best practices, and when to use them.

This knowledge will complement what we've learned about properties and enhance your object-oriented programming skills.