2914
Комментарий:
|
5549
|
Удаления помечены так. | Добавления помечены так. |
Строка 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''' |
Классы и ООП
Разбор Д/З
ООП (предупреждение: не читайте Википедию, там частное вместо общего ):
Инкапсуляция: иерархическое пространство объектов (как правило реализовано деревом пространства имён)
- категоризация объектов
связь объекта и его namespace
- механизм реализации наследования и полиморфизма
Python3 (и не только ): объект.поле
на самом деле это просто словари
Наследование: повторное использование свойств объекта при создании нового (есть несколько путей: прототипирование, классы/подклассы, /?\ что ещё?)
описание только разницы между исходным и новым объектом
знание о предках и их свойствах (интроспекция)
- ⇒ объектное планирование сложных и сверхсложных систем
- Python3 (и не только): классы и подклассы
Полиморфизм: повторное использование возможностей объекта при использовании принципиально другого объекта
реализация только разницы возможностей между исходным и новым объектом (во многих языках совпадает с механизмом наследования)
- ⇒ объектное планирование сложных и сверхсложных систем
- правила работы с отличающимися свойствами (например, то делать с дополнительными полями? много ещё чего)
- Python3 (ещё примеры? Ruby?): параметрический полиморфизм, он же в данном случае Duck Typing: любой метод/функцию можно применять к любым объектам, лишь бы
- этот метод был,
- количество параметров было допустимым
эти три правила были применимы к коду метода/функции
Спецметоды и перегрузка операций
Базовая статья: 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?
Возможности какие-то запредельные, если вдуматься
Наследование
- видимость имён
Откуда берётся и что видит d.fun()?
что делать, если мы хотим, его доопределить (в первую очередь .__init__())?
Порождение новых объектов: c = a + b, какого типа c, если .__add__() определён в родительском классе?
Как не перебить случайно поле родительского класса?
спецполя с именами вида ._что-то-там по договорённости непубличные
спецполя с именами вида .__что-то-там, их раскрытие в ._имя-класса__что-то-там
Множественное наследование
- сеть вместо дерева — проблемы
метаклассы/слоты/дескрипторы/что-то ещё — след. семестр?
Д/З
TODO