Наследование и Дескрипторы

Разбор Д/З (если нужен)

Наследование

   1 cass C:
   2     def fun(self):
   3 
   4 class D(C):
   5     pass
   6 
   7 d = D()

Множественное наследование, MRO — TODO

Дескрипторы

см. https://docs.python.org/3/howto/descriptor.html

Вместо .__dict__ — механизм с getter-ами и setter-ами.

   1 class Dsc:
   2     value = None
   3     def __get__(self, obj, cls):
   4         print("Get from {0} class {1}".format(obj, cls))
   5         return self.value
   6 
   7     def __set__(self, obj, val):
   8         print("Set {0} for {1}".format(val, obj))
   9         self.value = val
  10 
  11     def __delete__(self, obj):
  12         print("Del from {0}".format(obj))
  13         self.value = None
  14 
  15 class C:
  16         data = Dsc()
  17 
  18         def __init__(self, name):
  19             self.name = name
  20 
  21         def __str__(self):
  22             return self.name
  23 
  24 d = C("De")
  25 print(d.data)
  26 d.data = 1
  27 print(d.data)
  28 del d.data

Обратите внимание: дескриптор — поле класса, так что

   1 e = C("Ye")
   2 d.data = 100500
   3 print(d.data)
   4 print(e.data)

даст

Set 100500 for De
Get from De class <class '__main__.C'>
100500
Get from Ye class <class '__main__.C'>
100500

В методах дескриптора всегда известно, через какой объект идёт доступ, поэтому при желании можно брать id(объект) и на этом основании делать что-то разное.


TODO

декораторы и property(), classmethod(), staticmethod()

weakref/метаклассы/слоты/что-то ещё — след. семестр?

Д/З

LecturesCMC/PythonIntro2017/10_InheritanceDescriptors (последним исправлял пользователь FrBrGeorge 2017-12-01 09:51:19)