93.22K
Categories: programmingprogramming informaticsinformatics

Introduction to Computer Science. Занятие 23. Принципы ООП. Класс, его методы и атрибуты. Инициализация объекта. Инкапсуляция

1.

Introduction to
Computer Science
ЗАНЯТИЕ 23

2.

Темы занятия
Принципы ООП
Класс, его методы и атрибуты
Инициализация объекта
Инкапсуляция
Наследование
Полиморфизм

3.

Инициализация объекта
Класс может содержать спецметод с именем
__init__() (два подчёркивания спереди и сзади).
Такой метод автоматически вызывается после создания
объекта, при этом в метод передаются аргументы,
записанные при создании объекта в круглых скобках
после имени класса.

4.

Инициализация объекта
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def distance(self, p):
return ((self.x-p.x)**2+(self.y-p.y)**2)**0.5
p1 = Point(3, 4)
p2 = Point(0, 0)
print(p1.distance(p2))
# 5.0

5.

Что насчёт инкапсуляции?
class Person:
def __init__(self, age):
self.__age = age
p = Person(100)
# AttributeError:'Person' object has no attribute '__age'
print(p.__age)
# вот как транслятор исказил имя
print(p._Person__age) # печатает '100'

6.

Класс Point (используется в
примерах)
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def dump(self):
return f'x={self.x} y={self.y}'

7.

Наследование классов – синтаксис
Имя базового класса (или перечень имён через
запятую) записывается в круглых скобках после имени
подкласса:
class Point3D(Point):
# здесь будет код класса Point3D
pass

8.

Работа с наследником
Даже в таком виде мы можем использовать подкласс
Point3D, ведь в нём есть все методы и атрибуты
базового класса:
point = Point3D(3, 4) # __init__() из Point
print(point.dump())

9.

Добавление атрибутов
Если в наследнике надо определить новые атрибуты,
перепишем (перекроем) его метод __init__():
class Point3D(Point):
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z

10.

Добавление и перекрытие методов
Новые методы просто записываются в теле наследника.
Наследник может перекрыть метод предка – описать
метод с таким же именем как у предка, но с другим
телом и, возможно, с другими параметрами.
Вызов в методе наследника метода предка:
▪ Класс_предка.метод_предка(self, параметры)
▪ super().метод_предка(параметры) – лучше так

11.

Добавление и перекрытие методов
class Point3D(Point):
def __init__(self, x, y, z):
# или так: Point.__init__(self, x, y)
super().__init__(x, y)
self.z = z
def dump(self):
return super().dump() + f' z={self.z}'
def is_zero(self):
return self.x**2 + self.y**2 + self.z**2 == 0

12.

Специальные методы
Специальный («магический») метод – метод с особым
именем (начинается и заканчивается двумя символами
подчеркивания), который вызывается транслятором для
выполнения операций над объектами и некоторых
синтаксических конструкций.
(Почти) все специальные методы перечислены здесь:
https://docs.python.org/3/reference/datamodel.html

13.

Специальные методы
Благодаря специальным методам объекты могут
реализовать и поддерживать базовые конструкции
языка:
◦ действия при создании и уничтожении объектов;
◦ перегрузка операций;
◦ строковое представление и форматирование;
◦ доступ к атрибутам;
◦ итерирование;
◦ вызов функций и методов;
◦ ...

14.

Метод __init__()
Его уже использовали: __init__() автоматически
вызывается после создания объекта и даёт возможность
создать и инициализировать атрибуты объекта:
class Point:
def __init__(self, x, y):
self.x = x
self.y = y

15.

Метод __del__()
Метод играет роль деструктора – вызывается пред
уничтожением объекта (а уничтожение происходит
после того, как на объект больше не осталось ссылок).
class Point:
# другие элементы класса Point не показаны
def __del__(self):
print('Bye!')
p = Point(3, 4)
del p # после этого увидим 'Bye!'

16.

Методы __ repr__() и__str__()
Метод __repr__() вызывается функцией repr(), чтобы
получить «официальное» строковое представление
объекта. В идеале, по этому представлению можно
воссоздать объект.
Метод __str__() используется функциями str(),
format() и print() и возвращает удобное для
пользователя строковое представление объекта. По
умолчанию __str__() просто вызывает __repr__().

17.

Переопределение __ repr__()
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self):
return f'<x={self.x}, y={self.y}>'
p = Point(3, 4)
print(p) # <x=3, y=4>
English     Русский Rules