Различия между версиями 3 и 4
Версия 3 от 2018-11-17 18:44:38
Размер: 3456
Редактор: FrBrGeorge
Комментарий:
Версия 4 от 2018-11-18 18:53:44
Размер: 3974
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 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

При передаче такого генератора в качестве единственного параметра функции скобки можно убрать.

Параметрические декораторы

Статья на Хабре (это продолжение, можно почитать и предыдущие две)

   1 def multicall(times):
   2     def decorator(fun):
   3         def newfun(*args):
   4             return [fun(*args) for i in range(times)]
   5         return newfun
   6     return decorator
   7 
   8 @multicall(5)
   9 def simplefun(N):
  10     return N*2+1
  11 
  12 print(*simplefun(4))

Объектная модель Python3

Основная статья: первый скетч про классы

  • Классы как пространства имён
  • Классы как конструкторы объектов
    • Класс — callable()

    • Поля класса и поля объектов, правила видимости
    • Метод как функция в классе, видимая «сквозь» объект:
      • Дополнительный первый параметр
      • Обязательное использование имени объекта (точнее, связи с объектом) при обращении к его полю
  • __init__(), когда вызывается

    • Заполнение полей объекта
    • Параметры __init__() и их передача

    • __del__(), когда вызывается (почитать тут)

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

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

Достаточно в классе определить соответствующие методы, и начинают работать len(), str() (и т. п.), а также всевозможные операции над экземплярами этого класса

  • __str__() и __repr()__

  • Арифметические операции
    • Весь список

    • Протокол арифметической операции с учётом «правой» версии:
      1. a+ba.__add__(b)

      2. Если возвращает специальный объект 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__()

Д/З

  1. Прочитать про классы в tutorial; про «волшебные методы» например, тут

LecturesCMC/PythonIntro2018/09_ObjectModel (последним исправлял пользователь FrBrGeorge 2018-11-28 01:22:04)