HomeProgrammingPythonPython Property

Python Property

Python has a great concept called property, which makes the life of an object oriented programmer much simpler. Before defining and going into details of what a property in Python is, let us first build an intuition on why it would be needed in the first place.

An Example To Begin With

Let us assume that one day you decide to make a class that could store the temperature in degree Celsius. It would also implement a method to convert the temperature into degree Fahrenheit. One way of doing this is as follows.

class Celsius:
    def __init__(self, temperature = 0):
        self.temperature = temperature

    def to_fahrenheit(self):
        return (self.temperature * 1.8) + 32

We could make objects out of this class and manipulate the attribute temperature, as we wished.

>>> # create new object
>>> man = Celsius()

>>> # set temperature
>>> man.temperature = 37

>>> # get temperature
>>> man.temperature
37

>>> # get degrees Fahrenheit
>>> man.to_fahrenheit()
98.60000000000001

The extra decimal places when converting into Fahrenheit is due to the floating point arithmetic error (try 1.1 + 2.2 in the Python interpreter). Whenever we assign or retrieve any object attribute liketemperature, as show above, Python searches it in the object’s __dict__ dictionary.

>>> man.__dict__
{'temperature': 37}

Therefore, man.temperature internally becomes man.__dict__['temperature'].

Now, let’s further assume that our class got popular among clients and they started using it in their programs. They did all kinds of assignments to the object. One faithful day, a trusted client came to us and suggested that temperatures cannot go below -273 degree Celsius (students of thermodynamics might argue that it’s actually -273.15), also called the absolute zero. He further asked us to implement this value constraint. Being a company that strive for customer satisfaction, we happily heeded the suggestion and released version 1.01, an upgrade of our existing class.

Using Getters and Setters

An obvious solution to the above constraint will be to hide the attribute temperature (make it private) and define new getter and setter interfaces to manipulate it. This can be done as follows.

class Celsius:
    def __init__(self, temperature = 0):
        self.set_temperature(temperature)

    def to_fahrenheit(self):
        return (self.get_temperature() * 1.8) + 32

    # new update
    def get_temperature(self):
        return self._temperature

    def set_temperature(self, value):
        if value < -273:
            raise ValueError("Temperature below -273 is not possible")
        self._temperature = value

We can see above that new methods get_temperature() and set_temperature() were defined and furthermore, temperature was replaced with _temperature. An underscore (_) at the beginning is used to denote private variables in Python.

>>> c = Celsius(-277)
Traceback (most recent call last):
...
ValueError: Temperature below -273 is not possible

>>> c = Celsius(37)
>>> c.get_temperature()
37
>>> c.set_temperature(10)

>>> c.set_temperature(-300)
Traceback (most recent call last):
...
ValueError: Temperature below -273 is not possible

This update successfully implemented the new restriction. We are no longer allowed to set temperature below -273.

Please note that private variables don’t exist in Python. There are simply norms to be followed. The language itself don’t apply any restrictions.

>>> c._temperature = -300
>>> c.get_temperature()
-300

But this is not of great concern. The big problem with the above update is that, all the clients who implemented our previous class in their program have to modify their code from obj.temperature toobj.get_temperature() and all assignments like obj.temperature = val toobj.set_temperature(val). This refactoring can cause headaches to the clients with hundreds of thousands of lines of codes.

All in all, our new update was not backward compatible. This is where property comes to rescue.

The Power of Property

The pythonic way to deal with the above problem is to use property. Here is how we could have achieved it.

class Celsius:
    def __init__(self, temperature = 0):
        self.temperature = temperature

    def to_fahrenheit(self):
        return (self.temperature * 1.8) + 32

    def get_temperature(self):
        print("Getting value")
        return self._temperature

    def set_temperature(self, value):
        if value < -273:
            raise ValueError("Temperature below -273 is not possible")
        print("Setting value")
        self._temperature = value

    temperature = property(get_temperature,set_temperature)

We added a print() function inside get_temperature() and set_temperature() to clearly observe that they are being executed. The last line of the code, makes a property object temperature. Simply put, property attaches some code (get_temperature and set_temperature) to the member attribute accesses (temperature). Any code that retrieves the value of temperature will automatically callget_temperature() instead of a dictionary (__dict__) look-up. Similarly, any code that assigns a value to temperature will automatically call set_temperature(). This is one cool feature in Python. Let’s see it in action.

>>> c = Celsius()
Setting value

We can see above that set_temperature() was called even when we created an object. Can you guess why? The reason is that when an object is created, __init__() method gets called. This method has the line self.temperature = temperature. This assignment automatically calledset_temperature().

>>> c.temperature
Getting value
0

Similarly, any access like c.temperature automatically calls get_temperature(). This is what property does. Here are a few more examples.

>>> c.temperature = 37
Setting value

>>> c.to_fahrenheit()
Getting value
98.60000000000001

By using property, we can see that, we modified our class and implemented the value constraint without any change required to the client code. Thus our implementation was backward compatible and everybody is happy.

Finally note that, the actual temperature value is stored in the private variable _temperature. The attribute temperature is a property object which provides interface to this private variable.

Digging Deeper into Property

In Python, property() is a built-in function that creates and returns a property object. The signature of this function is

property(fget=None, fset=None, fdel=None, doc=None)

where, fget is function to get value of the attribute, fset is function to set value of the attribute,fdel is function to delete the attribute and doc is a string (like a comment). As seen from the implementation, these function arguments are optional. So, a property object can simply be created as follows.

>>> property()
<property object at 0x0000000003239B38>

A property object has three methods, getter(), setter(), and delete() to specify fget, fset andfdel at a later point. This means, the line

temperature = property(get_temperature,set_temperature)

could have been broken down as

# make empty property
temperature = property()
# assign fget
temperature = temperature.getter(get_temperature)
# assign fset
temperature = temperature.setter(set_temperature)

These two pieces of codes are equivalent.

Programmers familiar with decorators in Python can recognize that the above construct can be implemented as decorators. We can further go on and not define names get_temperature andset_temperature as they are unnecessary and pollute the class namespace. For this, we reuse the name temperature while defining our getter and setter functions. This is how it can be done.

class Celsius:
    def __init__(self, temperature = 0):
        self._temperature = temperature

    def to_fahrenheit(self):
        return (self.temperature * 1.8) + 32

    @property
    def temperature(self):
        print("Getting value")
        return self._temperature

    @temperature.setter
    def temperature(self, value):
        if value < -273:
            raise ValueError("Temperature below -273 is not possible")
        print("Setting value")
        self._temperature = value

The above implementation is both, simple and recommended way to make properties. You will most likely encounter these types of constructs when looking for property in Python.

Well that’s it for today.

- A word from our sponsors -

spot_img

Most Popular

1 Comment

Leave a reply

Please enter your comment!
Please enter your name here

More from Author

500 million WhatsApp Numbers have been Hacked from 84 nations

A shocking allegation claims that the phone numbers of nearly 500...

Freddy Film Review

Kartik Aryan alias Freddy Ginwala is a successful dentist. When it...

Putin Plans to Replace SWIFT With Blockchain Payment System

Russian President Vladimir Putin criticized monopolies in global financial payment systems...

Bitget Crypto Exchange Flips Layoff Trend, Expands to Africa

The cryptocurrency winter has been colder for some than others. While...

- A word from our sponsors -

spot_img

Read Now

500 million WhatsApp Numbers have been Hacked from 84 nations

A shocking allegation claims that the phone numbers of nearly 500 million WhatsApp users have been hacked and listed for sale online. The issue around a data breach has already included Meta or one of its services. 487 million WhatsApp users' phone numbers have reportedly been compromised and are...

Freddy Film Review

Kartik Aryan alias Freddy Ginwala is a successful dentist. When it comes to his personal life, he is not successful as since last 5 years he is desperately looking for his soulmate. One day he gets his love but that love changes his life completely. Analysis of the...

Putin Plans to Replace SWIFT With Blockchain Payment System

Russian President Vladimir Putin criticized monopolies in global financial payment systems and called for an independent and blockchain-based settlement network, speaking at the International AI Travel conference in Moscow on 24 November. Russia’s Rostec Group, a government organization, has developed a blockchain platform to launch a digital system for...

Bitget Crypto Exchange Flips Layoff Trend, Expands to Africa

The cryptocurrency winter has been colder for some than others. While some cryptocurrency exchanges are forced to conduct massive employee layoffs to weather the bear market, others like Bitget Crypto Exchange continue to make massive hires to improve their services, Bitget crypto exchange flips the layoff trend. On...

New iPhone15 Leaks Reveals Stunning Design and No Sim Card

The first iPhone 15 leaks have already promised a combination of eye-catching and controversial design changes. And excitement is only likely to grow further now a new exclusive has revealed another stunning design decision. In a move that would see Apple step back in time, a new leak from anonymous...

Get iPhone 14 Under 60000 on Flipkart – Limited Time

The original price of the iPhone 14 is Rs 79,900. However, you can get the device at a discount of Rs 5000 if you have an HDFC bank card how the deal works The original price of the iPhone 14 is Rs 79,900. However, you can get the device...

Download Unofficial TWRP for Samsung A135 Exynos

​ DISCLAIMER: I WAS NEVER, HAVE NEVER BEEN, AND WILL NEVER BE RESPONSIBLE FOR ANY DAMAGES AGAINST YOUR DEVICES. We are not responsible for bricked devices, dead SD cards, thermonuclear war, or you getting fired because the alarm app failed. Please do some research if you have any concerns about the...

Android 13 and One UI 5 for Samsung Galaxy A52

Samsung was widely panned for its slow and non-existent software support during the TouchWiz era. Over the years, though, it has made considerable improvements in this area, and with One UI 5, the Korean giant has raised the bar to a new level altogether. The Galaxy S22 was...

Presearch Coin | Earn Crypto While You Search | 25 Pre Coin for Signup

Presearch offers PRE tokens as a reward for those who search through the platform. These tokens have intrinsic value because they are the access tokens purchased by advertisers to target searchers entering certain keywords. The amount currently provided to searchers is 0.25 PRE if they search through the...

Nodle Joins First Polkadot Parachain Auction

Nodle, one of the world’s largest ecosystems of connected devices, today announced their entrance into Polkadot’s inaugural parachain slot auction and crowdloan. Nodle provides infrastructure, software, and data access to the Internet of Things (IoTs) using Bluetooth Low Energy (BLE) on existing smartphones. Polkadot is a blockchain...

How to Mine Nodle Cash IoT Network

Introduction Nodle – built on a Bluetooth Low Energy (BLE) network – is a connectivity provider for the Internet of Things (IoT). The network helps companies and cities collect data from their devices, sensors, and tags. The Nodle Network can help manufactures/operators of electronic devices collect valuable data and also help...

Ethereum Whales on Move – Relocate Over $500,000,000 Matter of Hours

A massive amount of Ethereum (ETH) worth half a billion dollars is on the move, as crypto whales relocate their ETH troves. This Friday, blockchain tracker Whale Alert spotted a series of transactions in which large Ethereum holders moved 237,419 ETH, worth $557,777,068, in just over 10 hours. In...