2022-03-21 00:00:00 +0000 - Written By Omprakash
Property Decorator and Property Method
-
Property decorator (i.e
@property) as well as Property method (i.eproperty()) provide same functionalty. -
That is of to enable the user to access a member method as member variable of a class.
-
With variable, we can Set its value, Get(retrieve) its value and Delete its value.
-
Therefore when accessing a method as variable we want all these three functionalities (as mentioned above).
-
For each of these functionality we have to create separate methods.
-
Three functionality means three methods namely - Getter, Setter, and Deleter.
CASE 1: Using Property Decorator
When using property deorator (i.e @property) all three method must have to follow an nameing convention that is,
If @property decorator is applied to a method - let us say fullname() then, property decorators will be applied as follows:
class Classname:
# this method will serve as setter
@property
def fullname(self,):
pass
@fullname.getter
def fullname(self,):
pass
@fullname.deleter
def fullname(self,):
pass
OR
class Classname:
# this method will serve as getter
@property
def fullname(self,):
pass
@fullname.setter
def fullname(self,):
pass
@fullname.deleter
def fullname(self,):
pass
OR
class Classname:
# this method will serve as deleter
@property
def fullname(self,):
pass
@fullname.setter
def fullname(self,):
pass
@fullname.getter
def fullname(self,):
pass
Convention is that, all the methods must have same name.
CASE 2: Using Property Method
When using Property method (i.e property()) we can create Getter, Setter and Deleter method with any name.
But after creating all these three methods we have to create a property() method object by passing name of Getter, Setter, and Deleter method in order.
For example:
class Classname:
def anyname(self,):
pass
def funnyname(self,):
pass
def bunnyname(self,):
pass
varname = property(anyname, bunnyname, funnyname)
Its not neccessay to have all three - Getter, Setter and Deleter method. If thats the case we have to pass method name as Keyword argument, that is,
varname = property(fget=anyname, fset=bunnyname, fdel=funnyname)
Complete Use case of Property decorator and method
class Student:
"""Usecase of property decorator and property method."""
def __init__(self, fname, lname) -> None:
self.fname = fname
self.lname = lname
#self.fullname = f"{fname} {lname}"
#@property
#def fullname(self):
def get_fullname(self):
return f"{self.fname} {self.lname}"
#@fullname.setter
#def fullname(self, name):
def set_fullname(self, name):
self.fname, self.lname = name.split()
#@fullname.deleter
#def fullname(self):
def del_name(self):
self.fname = None
self.lname = None
fullname = property(fget=get_fullname, fset=set_fullname, fdel=del_name)
obj = Student("Omprakash", "Mishra")
print(obj.fullname)
obj.fname = "Pratham"
print(obj.fullname)
obj.fullname = "Nishant Tiwari"
print(obj.fname)
print(obj.lname)
print(obj.fullname)
del obj.fullname
print(obj.fullname)
Output be like:
Omprakash Mishra
Pratham Mishra
Nishant
Tiwari
Nishant Tiwari
None None