3456
Комментарий:
|
3974
|
Удаления помечены так. | Добавления помечены так. |
Строка 61: | Строка 61: |
* `__del__()`, когда вызывается ([[py3ref:datamodel.html#object.__del__|почитать тут]]) | |
Строка 64: | Строка 65: |
Достаточно в классе определить соответствующие методы, и начинают работать `lrn()`, `str()` (и т. п.), а также всевозможные операции над экземплярами этого класса | Достаточно в классе определить соответствующие методы, и начинают работать `len()`, `str()` (и т. п.), а также всевозможные операции над экземплярами этого класса |
Строка 67: | Строка 68: |
* [[py3ref:datamodel.html#emulating-numeric-types|Весь список]] | |
Строка 85: | Строка 87: |
* Прочие операции (сравнения, сдвиги, `__getitem__()` и т. д.) | * Прочие операции (сравнения, сдвиги, `@` и т. д.) * Правые версии, версии для `+=` и ему подобных * `__getitem__()`, `__len___()`, `__iter__()` * … |
Строка 88: | Строка 93: |
'''TODO''' | 1.#0 Прочитать про классы [[py3tut:classes.html|в tutorial]]; про «волшебные методы» [[https://dbader.org/blog/python-dunder-methods|например, тут]] 1. |
Объектная модель Python3
Долг за прошлый раз
Циклический конструктор генератора
>>> a=(i*2+1 for i in range(0,10,2) if i!=6) >>> a <generator object <genexpr> at 0x7feea8cd2938> >>> next(a) 1 >>> next(a) 5 >>> next(a) 9 >>> next(a) 17 >>> next(a) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration >>> def fn(seq): ... print(*seq) ... >>> fn((1,2,3)) 1 2 3 >>> fn(i*2+1 for i in range(10) if i!=6) 1 3 5 7 9 11 15 17 19
При передаче такого генератора в качестве единственного параметра функции скобки можно убрать.
Параметрические декораторы
Статья на Хабре (это продолжение, можно почитать и предыдущие две)
Объектная модель Python3
Основная статья: первый скетч про классы
- Классы как пространства имён
- Классы как конструкторы объектов
Класс — callable()
- Поля класса и поля объектов, правила видимости
- Метод как функция в классе, видимая «сквозь» объект:
- Дополнительный первый параметр
- Обязательное использование имени объекта (точнее, связи с объектом) при обращении к его полю
__init__(), когда вызывается
- Заполнение полей объекта
Параметры __init__() и их передача
__del__(), когда вызывается (почитать тут)
Перегрузка операций
Базовая статья: datamodel.html
Достаточно в классе определить соответствующие методы, и начинают работать len(), str() (и т. п.), а также всевозможные операции над экземплярами этого класса
__str__() и __repr()__
- Арифметические операции
- Протокол арифметической операции с учётом «правой» версии:
a+b → a.__add__(b)
Если возвращает специальный объект NotImplemented, но есть b.__radd__(), попробовать b.__radd__(a):
>>> s, n = "QWE", 8 >>> type(s), type(n) (<class 'str'>, <class 'int'>) >>> s*n 'QWEQWEQWEQWEQWEQWEQWEQWE' >>> s.__mul__(n) 'QWEQWEQWEQWEQWEQWEQWEQWE' >>> n*s 'QWEQWEQWEQWEQWEQWEQWEQWE' >>> n.__mul__(s) NotImplemented >>> s.__rmul__(n) 'QWEQWEQWEQWEQWEQWEQWEQWE'
Прочие операции (сравнения, сдвиги, @ и т. д.)
Правые версии, версии для += и ему подобных
__getitem__(), __len___(), __iter__()
- …
Д/З
Прочитать про классы в tutorial; про «волшебные методы» например, тут