Введение в классы
Pазбор Д/З
Ещё про словари
- Именные параметры функции и словари
TODO globals() и locals(); пример
Классы
(базовая статья «Классы в Python3 — это очень просто»)
Пространства имён:
- Встроенные объекты
locals()/globals()__builtins__()
- Модули
BTW: запуск модуля как программы, __name__
- Всё это неуниверсально ⇒ классы
Замена dir() для просмотра списка методов, чьё имя не начинается на «"_"»:
Классы как пустой горшокпространства имён: инкапсуляция
- туда что хочешь можно положить!
- Классы как конструкторы объектов:
Если класс вызвать как функцию, он породит экземпляр класса (объект)
- Объект:
- Точка доступа к полям класса
- Может содержать свои поля: поле объекта «загораживает» поле класса с те же именем
Содержимое конструктора класса — заполнение его пространства имён. Доступ к полям класса/объекта, разумеется, возможен только с помощью объекта, в чьём пространстве имён находится поле:
- Методы. Если в класс положить функцию, а посмотреть на неё через его экземпляр (объект), функция превратится в метод
Метод отличается от функции только тем, что ему дополнительно в качестве нулевого параметра передаётся объект, через который мы смотрим на эту функцию:
1 >>> def fun(*argp): 2 ... print(*argp) 3 ... 4 >>> fun 5 <function fun at 0x7efbfe418f28> 6 >>> fun(1,2,"QQ") 7 1 2 QQ 8 >>> C.foon=fun 9 >>> C.foon 10 <function fun at 0x7efbfe418f28> 11 >>> C.foon(1,2,"QQ") 12 1 2 QQ 13 >>> b 14 <__main__.C object at 0x7efbfe430c88> 15 >>> b.foon(1,2,"QQ") 16 <__main__.C object at 0x7efbfe430c88> 1 2 QQ
- таким образом можно обращаться к полям этого объекта (или к полям класса, если полей объекта нет)
имя этого нулевого параметра может быть каким угодно, «self» — просто конвенция
Спецметод .__init__() вызывается всегда после создания объекта, но перед тем, как конструктор вернёт его пользователю. В нём можно заполнять поля именно объекта:
Конструктор объекта можно вызвать с параметрами, они передадутся __init__()-у
Д/З
Прощёлкать FrBrGeorge/ClassesInPython3
- Прочитать
о модулях в учебнике
о классах в учебнике
EJudge: DummyClass 'Просто класс'
Написать класс Delay, экземпляры которого содержат объект slot (задаётся конструктором) и метод delay(new), который присваивает slot новое значение new, а возвращает предыдущее значение slot.
de = Delay(100500) print(de.delay(42)) print(de.delay(0)) print(de.slot) print(*sorted(s for s in dir(de) if not s.startswith("_")))
100500 42 0 delay slot
EJudge: CountInt 'Целые поля'
Ввести (с помощью eval(input())) некоторый объект Python3 и посчитать, склько у него целочисленных полей (включая спецполя, имя которых начинается на "_").`
100500
4
EJudge: SharedBrain 'Единый мозг'
Input: Output:EJudge: NormalDouble 'Простой и двойной'
Написать два класса — Normal и Double, в каждом из которых будет два метода — .swap(other) и .what() (и .__init__(start), задающий начальное значение некоторому полю. Метод .what() класса Normal должен возвращать значение этого поля, а .swap(other) — менять местами значния полей текущего объекта и объекта other. Аналогичные методы класса Double должны все значения умножать на 2: само поле — при инициализации и обмене (у обоих объектов), возвращаемое значение — в методе .what()
3 4 2 6 6 8