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

Долги за прошлый раз:

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

Объектное планирование и ООП

ООП:

Характеристика

Python3

Инкапсуляция (не сокрытие)

Иерархия пространств имён

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

Наследование + C3 MRO

Полиморфизм

«Из коробки», т. к. duck typing

Проксирование?

Хранить родительский объект в виде поля, а все методы нового класса делать обёрткой вокруг методов родительского объекта.

TODO пример

Простое наследование

Множественное наследование

Д/З

  1. Повторить 15-ю и 16-ю главы учебника, прочитать и прощёлкать 17-ю и 18-ю главы учебника

    • Прочитать статьи про линеаризацию
      • Зачем в описании линеаризации участвует объединение линеаризаций родительских классов и самих классов (в лекциях я это опустил)?

      • Иными словами, чему служит выделенная часть:
        • L[C(B1 ... BN)] = C + merge(L[B1] ... L[BN], B1 ... BN)

      • Много ли мы теряем от того, что C3, в отличие от обхода дерева, может завершиться неудачей?
  2. EJudge: DivStr 'Деление строки'

    Написать класс DivStr, унаследованный от str, который поддерживал бы операцию деления «//» и остатка от деления «%». Деление на N должно возвращать список из N подстрок одинаковой наибольшей длины, на которые можно разделить исходную строку, а остаток — оставшуюся концевую подстроку меньшей длины (возможно, пустую)

    Input:

       1 a = DivStr("XcDfQWEasdERTdfgRTY")
       2 print(*a//4)
       3 print(a%4)
    
    Output:

    XcDf QWEa sdER Tdfg
    RTY
  3. EJudge: DefCounter 'Счётчик с умолчанием'

    (исследовательская задача) Написать класс DefCounter, унаследованный от collections.Counter, в котором значения для несуществующих элементов были бы не 0, а задавались в конструкторе именным параметром missing= (по умолчанию — -1).

    Input:

    A = DefCounter("QWEqweQWEqweQWE", missing=-10)
    print(A)
    print(A["Z"])
    A["P"]+=5
    print(A)
    Output:

    DefCounter({'Q': 3, 'W': 3, 'E': 3, 'q': 2, 'w': 2, 'e': 2})
    -10
    DefCounter({'Q': 3, 'W': 3, 'E': 3, 'q': 2, 'w': 2, 'e': 2, 'P': -5})
  4. EJudge: LetterAttr 'Буквенное поле'

    Написать класс LetterAttr, в котором будут допустимы поля с любым именем; значение каждого поля по умолчанию будет совпадать с именем поля (строка), а при задании нового строкового значения туда будут попадать только буквы, встречающиеся в имени поля.

    Input:

       1 A = LetterAttr()
       2 print(A.letter)
       3 print(A.digit)
       4 A.letter = "teller"
       5 print(A.letter)
       6 A.letter = "fortune teller"
       7 print(A.letter)
    
    Output:

    letter
    digit
    teller
    rteteller

LecturesCMC/PythonIntro2018/10_Inheritance (last edited 2018-11-27 22:21:53 by FrBrGeorge)