Различия между версиями 10 и 11
Версия 10 от 2018-11-18 20:39:20
Размер: 4586
Редактор: FrBrGeorge
Комментарий:
Версия 11 от 2018-11-26 12:09:56
Размер: 4815
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 98: Строка 98:
 1.#0 Прочитать про классы [[py3tut:classes.html|в tutorial]]; про «волшебные методы» [[https://dbader.org/blog/python-dunder-methods|например, тут]]  1.#0 Прочитать и прощёлкать [[http://greenteapress.com/thinkpython2/html/thinkpython2016.html|15-ю]] и [[http://greenteapress.com/thinkpython2/html/thinkpython2017.html|16-ю]] главы учебника

  *
Прочитать про классы [[py3tut:classes.html|в tutorial]]; про «волшебные методы» [[https://dbader.org/blog/python-dunder-methods|например, тут]]

Объектная модель 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__(), когда вызывается (почитать тут)

  • isinstance()

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

Базовая статья: special-method-names

Достаточно в классе определить соответствующие методы, и начинают работать 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__()

Долги: __iter__, __del__, hasattr()/getattr()

Долг yield from (!)

Д/З

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

  2. EJudge: SelfCount 'Сколько экземпляров?'

    Написать класс we, содержащий поле count, в котором хранится информация о количестве существующих экземпляров этого класса.

    Input:

    a = we()
    print(a.count)
    b, c = we(), we(),
    print(a.count, b.count, c.count)
    del b
    print(a.count)
    Output:

    1
    3 3 3
    2
  3. EJudge: DummyVec 'Что-то вроде вектора'

    Написать класс vector, представляющий нечто, похожее на вектор. Должна поддерживаться операция вывода в формате, представленном в примере, конструирование из произвольной числовой последовательности ненулевой длины, а также сложение с числовой последовательностью такой же длины (в том числе с другим vector)

    a, b = vector([2,1,2,1,2,1,2,1]), vector(range(8))
    print(a, b, a+b, b+range(8), range(8)+b)
    Input:

    a, b = vector([2,1,2,1,2,1,2,1]), vector(range(8))
    print(a, b, a+b, b+range(8), range(8)+b)
    Output:

    2:1:2:1:2:1:2:1 0:1:2:3:4:5:6:7 2:2:4:4:6:6:8:8 0:2:4:6:8:10:12:14 0:2:4:6:8:10:12:14
  4. EJudge: StrangeDots 'Странные отрезки'

    Написать класс Dots, генерирующий заданное количество точек на заданом отрезке

    • При создании объекта типа Dots задаются вещественные границы отрезка

    Объект d типа Dots должен поддерживать индексирование по таким правилам:

    • d[n] — последовательность из n равноудалённых точек от начала до конца отрезка (включая конец)

    • d[i:n]i-я точка такой последовательности

    • d[i:j:n] — последовательность начиная с i-той и заканчивая j-1-й точкой такой последовательности

    • Выход за границы отрезка означает экстраполяцию (см. пример)
    Input:

    a = Dots(0,40)
    print(*a[5])
    print(a[0:5])
    print(a[2:5])
    print(a[4:5])
    print(a[7:5])
    print(a[-7:5])
    print(*a[1:3:5])
    print(*a[:3:5])
    print(*a[2::5])
    print(*a[::5])
    print(*a[-2:6:5])
    Output:

    0.0 10.0 20.0 30.0 40.0
    0.0
    20.0
    40.0
    70.0
    -70.0
    10.0 20.0
    0.0 10.0 20.0
    20.0 30.0 40.0
    0.0 10.0 20.0 30.0 40.0
    -20.0 -10.0 0.0 10.0 20.0 30.0 40.0 50.0

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