Различия между версиями 3 и 4
Версия 3 от 2017-11-17 15:03:14
Размер: 2914
Редактор: FrBrGeorge
Комментарий:
Версия 4 от 2017-11-17 16:18:06
Размер: 5549
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 3: Строка 3:
ООП (предупреждение: не читайте Википедию, там C++ style only :( ): Разбор [[../07_Dicts|Д/З]]

ООП (предупреждение: не читайте Википедию, там частное вместо общего :( ):
Строка 24: Строка 27:
== Перегрузка операций ==
На самом деле всё наоборот — это операций нет,
== Спецметоды и перегрузка операций ==
Базовая статья: [[py3ref:datamodel.html#special-method-names]]

Операций нет, а есть методы; операции — это
 * вызов метода, или
 * логика вызовов нескольких методов
=== Базовые функции ===
 * `__dict__()` :), примеры
 * `__init__()` / `__del__()` (Note: `del x` doesn’t directly call `x.__del__()`)
 * `__str__()`,`__repr__()`,`__bytes__()` — `str(x)`
 * `__bool__()`, `__len__()` — пустой ли?
 * `__getattr__()` / `__getattribute__()` / `__setattr__()` / `__delattr__()` / `__dir__()` — «.» и около
=== Последовательности и прочие хранилища ===
 * `__getitem__()` / `__setitem__()` / `__delitem__()`/ `__missing__()`
 * `__iter__()`
 * `__reversed__()` или __len__() + __getitem__() — `reversed(x)`
 * `__contains__()` — `a in x`
=== Числа ===
 * Базовые операции (типа `__add__()`), в т. ч. несуществующая `@` (`__mathmul__()`)
 * Инкрементальные операции типа `+=` (`__iadd__()`)
 * Правые операции (`__radd__()`), их происхождение и протокол применения
  * `"qwe"*3` vs. `3*"qwe"` vs. `"qwe".__mul__(3)` vs. `3.__mul__("qwe")` vs. `"qwe".__rmul__(3)`

 * Порождение новых объектов: `c = a + b`, какого типа `c`?

Возможности какие-то запредельные, если вдуматься
Строка 28: Строка 55:
КБС Duck Typing
 * .
 {{{#!highlight pythpn3
cass C:
    def fun(self):
        …
class D(C):
    pass
Строка 31: Строка 62:
d = D()
 }}}
 * видимость имён
  * Откуда берётся и что видит `d.fun()`?
 * что делать, если мы хотим, его доопределить (в первую очередь `.__init__()`)?
 * Порождение новых объектов: `c = a + b`, какого типа `c`, если `.__add__()` определён в родительском классе?
 * Как не перебить ''случайно'' поле родительского класса?
  * спецполя с именами вида `._что-то-там` по договорённости непубличные
  * спецполя с именами вида `.__что-то-там`, их раскрытие в `._имя-класса__что-то-там`

Множественное наследование
 * сеть вместо дерева — проблемы
 * [[https://www.python.org/download/releases/2.3/mro/|MRO]]

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

== Д/З ==
Строка 32: Строка 80:

приватные поля

перегрузка операций

наследование, MRU
'''TODO'''

Классы и ООП

Разбор Д/З

ООП (предупреждение: не читайте Википедию, там частное вместо общего :( ):

  1. Инкапсуляция: иерархическое пространство объектов (как правило реализовано деревом пространства имён)

    • категоризация объектов
    • связь объекта и его namespace

    • механизм реализации наследования и полиморфизма
    • Python3 (и не только :) ): объект.поле

      • на самом деле это просто словари :)

  2. Наследование: повторное использование свойств объекта при создании нового (есть несколько путей: прототипирование, классы/подклассы, /?\ что ещё?)

    • описание только разницы между исходным и новым объектом

    • знание о предках и их свойствах (интроспекция)

      • ⇒ объектное планирование сложных и сверхсложных систем
    • Python3 (и не только): классы и подклассы
  3. Полиморфизм: повторное использование возможностей объекта при использовании принципиально другого объекта

    • реализация только разницы возможностей между исходным и новым объектом (во многих языках совпадает с механизмом наследования)

      • ⇒ объектное планирование сложных и сверхсложных систем
    • правила работы с отличающимися свойствами (например, то делать с дополнительными полями? много ещё чего)
    • Python3 (ещё примеры? Ruby?): параметрический полиморфизм, он же в данном случае Duck Typing: любой метод/функцию можно применять к любым объектам, лишь бы
      1. этот метод был,
      2. количество параметров было допустимым
      3. эти три правила были применимы к коду метода/функции

Спецметоды и перегрузка операций

Базовая статья: datamodel.html

Операций нет, а есть методы; операции — это

  • вызов метода, или
  • логика вызовов нескольких методов

Базовые функции

  • __dict__() :), примеры

  • __init__() / __del__() (Note: del x doesn’t directly call x.__del__())

  • __str__(),__repr__(),__bytes__()str(x)

  • __bool__(), __len__() — пустой ли?

  • __getattr__() / __getattribute__() / __setattr__() / __delattr__() / __dir__() — «.» и около

Последовательности и прочие хранилища

  • __getitem__() / __setitem__() / __delitem__()/ __missing__()

  • __iter__()

  • __reversed__() или len() + getitem() — reversed(x)

  • __contains__()a in x

Числа

  • Базовые операции (типа __add__()), в т. ч. несуществующая @ (__mathmul__())

  • Инкрементальные операции типа += (__iadd__())

  • Правые операции (__radd__()), их происхождение и протокол применения

    • "qwe"*3 vs. 3*"qwe" vs. "qwe".__mul__(3) vs. 3.__mul__("qwe") vs. "qwe".__rmul__(3)

  • Порождение новых объектов: c = a + b, какого типа c?

Возможности какие-то запредельные, если вдуматься

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

  • Подсветка не поддерживается для синтаксиса «pythpn3», см. список поддерживаемых синтаксисов для подсветки на странице ПомощьПоПарсерам.
       1 cass C:
       2     def fun(self):
       3 
       4 class D(C):
       5     pass
       6 
       7 d = D()
    
  • видимость имён
    • Откуда берётся и что видит d.fun()?

  • что делать, если мы хотим, его доопределить (в первую очередь .__init__())?

  • Порождение новых объектов: c = a + b, какого типа c, если .__add__() определён в родительском классе?

  • Как не перебить случайно поле родительского класса?

    • спецполя с именами вида ._что-то-там по договорённости непубличные

    • спецполя с именами вида .__что-то-там, их раскрытие в ._имя-класса__что-то-там

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

  • сеть вместо дерева — проблемы
  • MRO

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

Д/З


TODO

LecturesCMC/PythonIntro2017/09_Overload (последним исправлял пользователь FrBrGeorge 2017-11-25 21:08:04)