Python - Descriptors

Descriptors


Example 1
class EmpNameDescriptor:
    def __get__(self, obj, owner):
        return self.__empname
    def __set__(self, obj, value):
        if not isinstance(value, str):
            raise TypeError("'empname' must be a string.")
        self.__empname = value
class EmpIdDescriptor:
    def __get__(self, obj, owner):
        return self.__empid
    def __set__(self, obj, value):
        if hasattr(obj, 'empid'):
            raise ValueError("'empid' is read only attribute")
        if not isinstance(value, int):
            raise TypeError("'empid' must be an integer.")
        self.__empid = value
class Employee:
    empid = EmpIdDescriptor()           
    empname = EmpNameDescriptor()       
    def __init__(self, emp_id, emp_name):
        self.empid = emp_id
        self.empname = emp_name
e1 = Employee(123456, 'John')
print(e1.empid, '-', e1.empname)  
e1.empname = 'Williams'
print(e1.empid, '-', e1.empname)
e1.empid = 76347322
Output
123456 - John
123456 - Williams

Example 2
class Employee:
    def __init__(self, emp_id, emp_name):
        self.empid = emp_id
        self.empname = emp_name
    def getEmpID(self):
        return self.__empid
    def setEmpID(self, value):
       if not isinstance(value, int):
            raise TypeError("'empid' must be an integer.")
        self.__empid = value
   empid = property(getEmpID, setEmpID)
    def getEmpName(self):
        return self.__empname
    def setEmpName(self, value):
        if not isinstance(value, str):
            raise TypeError("empname' must be a string.")
        self.__empname = value
    def delEmpName(self):
        del self.__empname
    empname = property(getEmpName, setEmpName, delEmpName)

e1 = Employee(123456, 'John')
print(e1.empid, '-', e1.empname)    # -> '123456 - John'
del e1.empname                      # Deletes 'empname'
print(e1.empname)                   #Raises 'AttributeError'

Output
123456 - John
AttributeError: ...

Example 3
class Employee:
    def __init__(self, emp_id, emp_name):
        self.empid = emp_id
        self.empname = emp_name
    @property
    def empid(self):
        return self.__empid
    @empid.setter
    def empid(self, value):
        if not isinstance(value, int):
            raise TypeError("'empid' must be an integer.")
        self.__empid = value
    @property
    def empname(self):
        return self.__empname
    @empname.setter
    def empname(self, value):
        if not isinstance(value, str):
            raise TypeError("'empname' must be a string.")
        self.__empname = value
    @empname.deleter
    def empname(self):
        del self.__empname
e1 = Employee(123456, 'John')
print(e1.empid, '-', e1.empname)    # -> '123456 - John'
del e1.empname                      # Deletes 'empname'
print(e1.empname)                   #Raises 'AttributeError'
Output
123456 - John
AttributeError: ...


Example 4
# Add Celsius class implementation below.
class Celsius:
    def __get__(self):
        return float(self._celsius)
    def __set__(self, value):
        self._celsius = value
# Add temperature class implementation below.        
class Temperature:
    def __init__(self, fahrenheit):
        self._fahrenheit = fahrenheit
        self._celsius    = self.to_celsius(fahrenheit)
    def to_celsius(self, f):
        return (f-32) * (5/9)
    def getFahrenheit(self):
        return self._fahrenheit
    def set_fahrenheit(self, value):
        self._fahrenheit = value
        self._celsius = self.to_celsius(value)
    def set_celsius(self,value):
        self._fahrenheit = self.to_fahrenheit(value)
        Celsius.__set__(self,value)
    def to_fahrenheit(self, c):
        return (9/5) * c + 32
    fahrenheit = property(getFahrenheit,set_fahrenheit)
    celsius = property(Celsius.__get__,set_celsius)

No comments:

Post a Comment