Объектно – ориентированное программирование (ООП) Артишевская Юлия, 222 группа Артишевская Юлия, 222 группа
Объектно-ориентированное программирование
Класс – пользовательский тип, описывающий устройство объекта. Объект «душа», сущность класса. Объект – «душа», сущность класса. ООП
Принципы ООП (Алан Кэй): все данные представляются объектами программа - набор взаимодействующих объектов, посылающих друг другу сообщения каждый объект имеет собственную часть памяти каждый объект имеет свой тип (класс) объекты одного типа могут принимать одни и те же сообщения
Механизмы ООП (принципы): Наследование Наследование - можно создавать специализированные классы на основе базовых (позволяет избегать написания повторного кода). Инкапсуляция Инкапсуляция - можно скрыть ненужные внутренние подробности работы объекта от окружающего мира (алгоритмы работы с данными хранятся вместе с данными). Композиция Композиция - объект может быть составным и включать в себя другие объекты. Абстракция Абстракция - придание объекту характеристик, которые отличают его от всех других объектов, четко определяя его концептуальные границы. Полиморфизм Полиморфизм - в разных объектах одна и та же операция может выполнять различные функции.
1. class 2. def (self [, ]): 3. Классы в Python
Пример класса 1. class Car(object): 2. color = "red" # свойство класса (атрибут) 3. def out(self): # метод класса 4. print (self.color + "!") 5. obj = Car() 6. print obj.color # red 7. obj.out() # red!
Объекты Все базовые типы в Python (число, строка, функция, модуль) - объекты. 1. import math 2. s = "Hello, world!" 3. s.replace('world', 'people')#Hello, people! x = math.sqrt(10.0) 6. print x.as_integer_ratio() 7. #( L, L)
1. class Car(object): 2. color = red 3. __color = green obj = Car() 6. obj.color = yellow # True 7. obj.__color = white # Error Private & Public свойства Все свойства должны быть Private.
1. class Car(object): 2. __speed = 0 3. def get_speed(self): 4. return self.__speed 5. def set_speed(self, speed): 6. assert isinstance(speed, int) 7. self.__speed = min(speed, 200) c = Car() 10. c.set_speed(60) 11. print c.get_speed() # 60 Getters & Setters Если вам надо иметь доступ к свойству, определите для него getter (accessor) и/или setter (mutator).
Достоинство метода: логика локализуется в одном месте. Достоинство метода: логика локализуется в одном месте. Getters & Setters Иначе: 1. class Car(object): 2. speed = 0 3. c = Car() 4. c.speed = min(speed1, 200) 5. # c.speed = min(speed2, 200) 7. #...
__init__ - метод, при создании объекта автоматически создающий ему атрибуты ( __init__ ). Конструктор 1. class Car(object): 2. def __init__(self,w,n=0): 3. self.what = w 4. self.numb = n c1 = Car("Lexus", 15) 7. c2 = Car("Niva") print c1.what,c1.numb # Lexus print c2.what,c2.numb # Niva 0
Параметры без значений по умолчанию указываются первыми, а параметры со значениями по умолчанию после. Конструктор class Car(object): def __init__(self,n=0,w): # ERROR...
1. class Car(object): 2. __speed = def __str__(self): 5. return "Car with speed" + str(self.__speed) 6. c = Car() 7. print c # Car speed 200 Строковое представление Метод __str__ : объекты печатают сами себя Метод __str__ : объекты печатают сами себя
- механизм ООП, позволяющий описать новый класс на основе родительского, т.ч. свойства и функциональность родительского класса заимствуются новым классом. Наследование Принцип : отношение «IS-A» («есть») Пример: «Лимузин есть машина». Если же имеется: «Машина содержит двигатель», то это класс машина содержит свойство двигатель, а не наследуется от него.
1. class DerName (BaseClassName): Наследование
Функция issubclass(X, Y) : является ли класс X подклассом класса Y Функция issubclass(X, Y) : является ли класс X подклассом класса Y Наследование 1. class A(object): pass 2. class B(A): pass issubclass(A, object) #True 5. issubclass(B, A) #True 6. issubclass(B, object) #True 7. issubclass(A, str) #False 8. issubclass (A, A) #True
1. class A(object): pass 2. class B(A): pass 3. print B.__mro__ 4. #(,, ) Наследование
- взаимозаменяемость объектов с одинаковым интерфейсом Полиморфизм 1. a = (1, 2, 3) 2. b = [ ' a ', ' b ', ' c ' ] 3. c = {1 : ' hello ', 2 : ' world ' } 4. ls = [a, b, c] 5. for x in ls: 6. print x[1], 7. # 2 b hello
- возможность использования одного и того же имени операции (метода) к объектам разных классов. Полиморфизм 1. class T1: 2. n=10 3. def total(self,N): 4. self.total = int(self.n) + int(N) 5. class T2: 6. def total(self,s): 7. self.total = len(str(s)) t1 = T1() 10. t2 = T2() 11. t1.total(45) 12. t2.total(45) 13. print t1.total, t2.total # 55 2
«If it looks like a duck and quacks like a duck, it must be a duck.» Duck Typing 1. def f(x): 2. return x.get_value() 3. # можно передавать объект любого типа, лишь бы у него был метод get_value()
1. class Car(object): pass 2. c = Car() print c # print Car # 7. print type(c) # 8. print c.__class__ # print type(Car) # 11. print type(type(c)) # 12. print Car.__class__ # print Car.__bases__ # (,) print type(type(Car)) # 17. print type(Car).__bases__ # (,) Дополнительно
Материалы по теме ООП python_part_6/index.html oriented_programming /