Woobinda

__getattr__, @property, дексрипотор

Aug 11th, 2016
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.79 KB | None | 0 0
  1. """
  2. СВОЙСТВА PROPERTY
  3. """
  4.  
  5. class CardHolder:
  6.     acctlen = 8
  7.     retireage = 59.5
  8.  
  9.     def __init__(self, acct, name, age, addr):
  10.         self.acct = acct
  11.         self.name = name
  12.         self.age = age
  13.         self.addr = addr
  14.  
  15.     def getName(self):
  16.         return self.__name
  17.     def setName(self, value):
  18.         value = value.lower().replace(' ', '_')
  19.         self.__name = value
  20.     name = property(getName, setName)
  21.  
  22.     def getAge(self):
  23.         return self.__age
  24.     def setAge(self, value):
  25.         if value < 0 or value > 150:
  26.             raise ValueError('invalid age')
  27.         else:
  28.             self.__age = value
  29.     age = property(getAge, setAge)
  30.  
  31.     def getAcct(self):
  32.         return self.__acct[:-3] + '***'
  33.     def setAcct(self, value):
  34.         value = value.replace('-', '')
  35.         if len(value) != self.acctlen:
  36.             raise TypeError('invalid acct number')
  37.         else:
  38.             self.__acct = value
  39.     acct = property(getAcct, setAcct)
  40.  
  41.     def remainGet(self):
  42.         return self.retireage - self.age
  43.     remain = property(remainGet)
  44.  
  45.  
  46.  
  47.  
  48. """
  49. ДЕСКРИПТОРЫ
  50. """
  51.  
  52. class CardHolder:
  53.     acctlen = 8
  54.     retireage = 59.5
  55.  
  56.     def __init__(self, acct, name, age, addr):
  57.         self.acct = acct
  58.         self.name = name
  59.         self.age = age
  60.         self.addr = addr
  61.  
  62.     class Name:
  63.         def __get__(self, instance, owner):
  64.             return self.name
  65.         def __set__(self, instance, value):
  66.             value = value.lower().replace(' ', '_')
  67.             self.name = value
  68.     name = Name()
  69.  
  70.     class Age:
  71.         def __get__(self, instance, owner):
  72.             return self.age
  73.         def __set__(self, instance, value):
  74.             if value < 0 or value > 150:
  75.                 raise ValueError('invalid age')
  76.             else:
  77.                 self.age = value
  78.     age = Age()
  79.  
  80.     class Acct:
  81.         def __get__(self, instance, owner):
  82.             return self.acct[:-3] + '***'
  83.         def __set__(self, instance, value):
  84.             value = value.replace('-', '')
  85.             if len(value) != instance.acctlen:
  86.                 raise TypeError('invalid acct number')
  87.             else:
  88.                 self.acct = value
  89.     acct = Acct()
  90.  
  91.     class Remain:
  92.         def __get__(self, instance, owner):
  93.             return instance.retireage - instance.age
  94.         def __set__(self, instance, value):
  95.             raise TypeError('cannot set remain')
  96.     remain = Remain()
  97.  
  98.  
  99.  
  100.  
  101. """
  102. __getattr__
  103. """
  104.  
  105. class CardHolder:
  106.     acctlen = 8
  107.     retireage = 59.5
  108.  
  109.     def __init__(self, acct, name, age, addr):
  110.         self.acct = acct
  111.         self.name = name
  112.         self.age = age
  113.         self.addr = addr
  114.  
  115.     def __getattr__(self, name):
  116.         if name == 'acct':
  117.             return self._acct[:-3] + "***"
  118.         elif name == 'remain':
  119.             return self.retireage - self.age
  120.         else:
  121.             raise AttributeError(name)
  122.  
  123.     def __setattr__(self, name, value):
  124.         if name == 'name':
  125.             value = value.lower().replace(' ', '_')
  126.         elif name == 'age':
  127.             if value < 0 or value > 150:
  128.                 raise ValueError('invalid age')
  129.         elif name == 'acct':
  130.             name = '_acct'
  131.             value = value.replace('-', '')
  132.             if len(value) != self.acctlen:
  133.                 raise TypeError('invalid acct number')
  134.         elif name == 'remain':
  135.             raise TypeError('cannot set remain')
  136.         self.__dict__[name] = value
  137.  
  138.  
  139.  
  140.  
  141. """
  142. __getattribute__
  143. """
  144.  
  145. class CardHolder:
  146.     acctlen = 8
  147.     retiareage = 59.5
  148.  
  149.     def __init__(self, acct, name, age, addr):
  150.         self.acct = acct
  151.         self.name = name
  152.         self.age = age
  153.         self.addr = addr
  154.  
  155.     def __getattribute__(self, name):
  156.         superget = object.__getattribute__
  157.         if name == 'acct':
  158.             return superget(self, 'acct')[:-3] + '***'
  159.         elif name == 'remain':
  160.             return superget(self, 'retiareage') - superget(self, 'age')
  161.         else:
  162.             return superget(self, name)
  163.  
  164.     def __setattr__(self, name, value):
  165.         if name == 'name':
  166.             value = value.lower().replace(' ', '_')
  167.         elif name == 'age':
  168.             if value < 0 or value > 150:
  169.                 raise ValueError('invalid age')
  170.         elif name == 'acct':
  171.             value = value.replace('-', '')
  172.             if len(value) != self.acctlen:
  173.                 raise TypeError('invalid acct number')
  174.         elif name == 'remain':
  175.             raise TypeError('cannot set remain')
  176.         self.__dict__[name] = value
Add Comment
Please, Sign In to add comment