Similar presentations:
Основы ООП в Python
1. Основы ООП в Python
2. Пример 1. Создание класса
Для того, чтобы создать класс, используйте ключевое слово class.Создадим класс с именем MyClass и свойством x:
class MyClass:
x=5
Создадим объект под названием p1, и выведем значение x:
p1 = MyClass()
print(p1.x)
3. Метод init - конструктор
• У всех классов есть функция под названием __init__(), котораявсегда выполняется при создании объекта. Используйте функцию
__init__() для добавления значений свойствам объекта или
других операций, которые необходимо выполнить, при создании
объекта.
• __init__() автоматически вызывается каждый раз при
использовании класса для создания нового объекта.
4. Особенности
• Конструктор — уникальный метод класса,• Первый параметр конструктора во всех случаях self (ключевое слово,
которое ссылается на сам класс).
• Конструктор нужен для создания объекта.
• Конструктор передает значения аргументов свойствам создаваемого
объекта.
• В одном классе всегда только один конструктор.
• Если класс определяется не конструктором, Python предположит, что
он наследует конструктор родительского класса.
• В других языках программирования конструкторов может быть
несколько. В Python — только один.
5. Пример 2
• Для создания класса под названием Person, воспользуемся функцией __init__(), чтобы добавить значения для имени и возраста:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p1 = Person("Василий", 36)
print(p1.name)
print(p1.age)
6. Пример 3
class Rectangle :'Это класс Rectangle'
# Способ создания объекта (конструктор)
def __init__(self, width, height):
self.width= width
self.height = height
def getWidth(self):
return self.width
def getHeight(self):
return self.height
# Метод расчета площади.
def getArea(self):
return self.width * self.height
7.
8. Пример 4. Конструктор с аргументами по умолчанию
class Person:# Параметры возраста и пола имеют значение по умолчанию.
def __init__(self, name, age=1, gender="Male"):
self.name = name
self.age = age
self.gender= gender
def showInfo(self):
print("Name: ", self.name)
print("Age: ", self.age)
print("Gender: ", self.gender)
9. Пример 5
from person import Person# Создать объект Person.
aimee = Person("Aimee", 21, "Female")
aimee.showInfo()
print(" --------------- ")
# возраст по умолчанию, пол.
alice = Person( "Alice" )
alice.showInfo()
print(" --------------- ")
# Пол по умолчанию.
tran = Person("Tran", 37)
tran.showInfo()
10. Пример 6. Методы объектов
• Объекты также содержат методы. Методы в объектах — это функции, принадлежащие объекту.• Создадим метод в классе Person.
• Добавим функцию, которая выводит приветствие, и выполним ее:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def myfunc(self):
print("Привет, меня зовут " + self.name)
p1 = Person("Василий", 36)
p1.myfunc()
11. Параметр self
• Параметр self является ссылкой на сам класс и используется длядоступа к переменным, принадлежащим классу.
• Его не обязательно называть self, вы можете называть его как
хотите, но он должен быть первым параметром любой функции в
классе.
• Используем слова mysillyobject и abc вместо self:
12. Пример 7
class Person:def __init__(mysillyobject, name, age):
mysillyobject.name = name
mysillyobject.age = age
def myfunc(abc):
print("Привет, меня зовут " + abc.name)
p1 = Person("Василий", 36)
p1.myfunc()
13. Изменение свойств объекта
• Вы можете изменять свойства объектов следующим образом.• Изменим возраст от p1 на 40:
p1.age = 40
• Свойства объектов можно удалять с помощью ключевого слова
del
del p1.age
14. Удаление объектов
• Вы можете удалить объекты, используя ключевое слово del.del p1
15. Сравнение объектов
16.
• Оператор == нужен, чтобы узнать, ссылаются ли два объекта наодно и то же место в памяти. Он вернет True, если это так.
Оператор != вернет True, если сравнить 2 объекта, которые
ссылаются на разные места в памяти.
17. Пример 8
from rectangle import Rectangler1 = Rectangle(20, 10)
r2 = Rectangle(20 , 10)
r3 = r1
# Сравните r1 и r2
test1 = r1 == r2 # --> False
# Сравните r1 и r3
test2 = r1 == r3 # --> True
print ("r1 == r2 ? ", test1)
print ("r1 == r3 ? ", test2)
print (" -------------- ")
print ("r1 != r2 ? ", r1 != r2)
print ("r1 != r3 ? ", r1 != r3)
18. Пример 9. Составляющие класса или объекта
• В Python присутствует функция dir, которая выводит список всех методов, атрибутов ипеременных класса или объекта.
from player import Player
# Вывести список атрибутов, методов и переменных объекта 'Player'
print(dir(Player))
print("\n\n")
player1 = Player("Tom", 20)
player1.address ="USA"
# Вывести список атрибутов, методов и переменных объекта 'player1'
print(dir(player1))
19. Вывод результата
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__','__eq__', '__format__', '__ge__', '__getattribute__', '__gt__',
'__hash__', '__init__', '__init_subclass__', '__le__', '__lt__',
'__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__setattr__', '__sizeof__', '__str__',
'__subclasshook__', '__weakref__', 'maxAge', 'minAge']
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__',
'__eq__', '__format__', '__ge__', '__getattribute__', '__gt__',
'__hash__', '__init__', '__init_subclass__', '__le__', '__lt__',
'__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__setattr__', '__sizeof__', '__str__',
'__subclasshook__', '__weakref__', 'address', 'age', 'maxAge',
'minAge', 'name']
20. Встроенные атрибуты класса
21. Локальные и глобальные переменные в классах
• Атрибуты класса также называются переменными. В зависимостиот области видимости, переменные также могут относиться к
двум типам: локальные переменные и глобальные переменные.
• Локальные переменные
• Локальная переменная в классе — это переменная, доступ к
которой возможен только внутри блока кода, в котором она
определена. Например, если вы определите переменную внутри
метода, к нему не удастся получить доступ откуда-либо вне
метода.
22. Пример 10
class Car:def start(self):
message = "Двигатель заведен"
return message
В скрипте выше мы создали локальную переменную message внутри метода
start() класса Car. Теперь создадим объект класса Car и попытаемся получить
доступ к локальной переменной message, как показано ниже:
car_a = Car()
print(car_a.message)
AttributeError: 'Car' object has no attribute 'message'
Это связано с тем, что мы не можем получить доступ к локальной переменной
вне блока, где эта локальная переменная была определена.
23. Модификаторы доступа
• Модификаторы доступа в Python используются для модификации области видимостипеременных по умолчанию. Есть три типа модификаторов доступов в Python ООП:
• публичный — public;
• приватный — private;
• защищенный — protected.
• Доступ к переменным с модификаторами публичного доступа открыт из любой точки вне
класса, доступ к приватным переменным открыт только внутри класса, и в случае с
защищенными переменными, доступ открыт только внутри того же пакета.
• Для создания приватной переменной, вам нужно проставить префикс двойного
подчеркивание __ с названием переменной.
• Для создания защищенной переменной, вам нужно проставить префикс из одного нижнего
подчеркивания _ с названием переменной. Для публичных переменных, вам не нужно
проставлять префиксы вообще.
24. Пример 11
class Car:def __init__(self):
print ("Двигатель заведен")
self.name = "corolla"
self.__make = "toyota"
self._model = 1999
Здесь мы создали простой класс Car с конструктором и тремя
переменными: name, make, и model (название, марка и модель).
Переменная name является публичной, в то время как переменные make
и model являются приватными и защищенными, соответственно.
25.
• Давайте создадим объект класса Car и попытаемся получить доступ к переменной name.Выполним следующий скрипт:
car_a = Car()
print(car_a.name)
• Так как name является публичной переменной, мы можем получить к ней доступ не из
класса. В выдаче вы увидите значение переменной name, выведенное в консоли.
• Теперь попробуем вывести значение переменной make. Выполняем следующий скрипт:
print(car_a.make)
• В выдаче мы получим следующее уведомление об ошибке:
• AttributeError: 'Car' object has no attribute 'make'
26. Наследование
• Основная идея наследования в объектно-ориентированномпрограммировании заключается в том, что класс может
наследовать характеристики другого класса. Класс, который
наследует другой класс, называется дочерним классом или
производным классом, и класс, который дает наследие,
называется родительским, или основным.
27. Пример 12. Наследование
# Создание класса Vehicleclass Vehicle:
def vehicle_method(self):
print("Это родительский метод из класса Vehicle")
# Создание класса Car, который наследует Vehicle
class Car(Vehicle):
def car_method(self):
print("Это метод из дочернего класса")
28.
• В скрипте выше мы создаем два класса: Vehicle и Car, который наследует класс Vehicle. Чтобы наследовать класс, вам нужнотолько вписать название родительского класса внутри скобок, которая следует за названием дочернего класса. Класс
Vehicle содержит метод vehicle_method(), а дочерний класс содержит метод car_method(). Однако, так как класс Car
наследует класс Vehicle, он также наследует и метод vehicle_method().
• Рассмотрим это на практике и выполним следующий скрипт:
• Python
• car_a = Car()
• car_a.vehicle_method() # Вызываем метод родительского класса
• В этом скрипте мы создали объект класса Car вызывали метод vehicle_method() при помощи объекта класса Car. Вы можете
обратить внимание на то, что класс Car не содержит ни одного метода vehicle_method(), но так как он унаследовал класс
Vehicle, который содержит vehicle_method(), класс Car также будет использовать его. Выдача выглядит следующим
образом:
• Python
• Это родительский метод из класса Vehicle
29.
30. Пример 13. Полиморфизм
• Термин полиморфизм буквально означает наличие нескольких форм. В контексте объектно-ориентированногопрограммирования, полиморфизм означает способность объекта вести себя по-разному.
• Полиморфизм в программировании реализуется через перегрузку метода, либо через его переопределение.
• Перегрузка метода
• Перегрузка метода относится к свойству метода вести себя по-разному, в зависимости от количества или типа параметров.
Взглянем на очень простой пример перегрузки метода. Выполним следующий скрипт:
# создаем класс Car
class Car:
def start(self, a, b=None):
if b is not None:
print (a + b)
else:
print (a)
programming