Объектно – ориентированное программирование (ООП) Артишевская Юлия , 222 группа Объектно-ориентированное программирование ООП -парадигма программирования, основными концепциями которой являются понятия «класс» и «объект». ООП Класс – пользовательский тип, описывающий устройство объекта. Объект класса. – «душа», сущность Принципы ООП (Алан Кэй): все данные представляются объектами программа - набор взаимодействующих объектов, посылающих друг другу сообщения каждый объект имеет собственную часть памяти каждый объект имеет свой тип (класс) объекты одного типа могут принимать одни и те же сообщения Механизмы ООП (принципы): Абстракция - придание объекту характеристик, которые отличают его от всех других объектов, четко определяя его концептуальные границы. Инкапсуляция - можно скрыть ненужные внутренние подробности работы объекта от окружающего мира (алгоритмы работы с данными хранятся вместе с данными). Наследование - можно создавать специализированные классы на основе базовых (позволяет избегать написания повторного кода). Полиморфизм - в разных объектах одна и та же операция может выполнять различные функции. Композиция - объект может быть составным и включать в себя другие объекты. Классы в Python 1. 2. 3. class <name> def <method> (self [, <arguments>]): <Function codes> Пример класса 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. 2. 3. import math s = "Hello, world!" s.replace('world', 'people')#Hello, people! 4. 5. 6. 7. x = math.sqrt(10.0) print x.as_integer_ratio() #(7120816245988179L, 2251799813685248L) Private & Public свойства 1. 2. 3. class Car(object): color = “red” __color = “green” 4. 5. 6. 7. obj = Car() obj.color = “yellow” # True obj.__color = “white” # Error Все свойства должны быть Private. Getters & Setters Если вам надо иметь доступ к свойству, определите для него getter (accessor) и/или setter (mutator). 1. 2. 3. 4. 5. 6. 7. class Car(object): __speed = 0 def get_speed(self): return self.__speed def set_speed(self, speed): assert isinstance(speed, int) self.__speed = min(speed, 200) 8. 9. 10. 11. c = Car() c.set_speed(60) print c.get_speed() # 60 Getters & Setters Достоинство метода: логика локализуется в одном месте. Иначе: 1. class Car(object): 2. speed = 0 3. c = Car() 4. c.speed = min(speed1, 200) 5. # ... 6. c.speed = min(speed2, 200) 7. # ... Конструктор - метод, при создании объекта автоматически создающий ему атрибуты ( __init__ ). 1. 2. class Car(object): def __init__(self,w,n=0): 3. self.what = w 4. self.numb = n 5. 6. c1 = Car("Lexus", 15) 7. c2 = Car("Niva") 8. 9. print c1.what,c1.numb # Lexus 15 10. print c2.what,c2.numb # Niva 0 Конструктор Параметры без значений по умолчанию указываются первыми, а параметры со значениями по умолчанию — после. class Car(object): def __init__(self,n=0,w): # ERROR . . . Строковое представление Метод __str__ : объекты печатают сами себя 1. class Car(object): 2. __speed = 200 3. ... 4. def __str__(self): 5. return "Car with speed" + str(self.__speed) 6. c = Car() 7. print c # Car speed 200 Наследование - механизм ООП, позволяющий описать новый класс на основе родительского, т.ч. свойства и функциональность родительского класса заимствуются новым классом. Принцип: отношение «IS-A» («есть») Пример: «Лимузин есть машина». Если же имеется: «Машина содержит двигатель», то это класс машина содержит свойство двигатель, а не наследуется от него. Наследование 1. 2. 3. 4. class DerName (BaseClassName): <statement-1> . . . <statement-N> Наследование Функция issubclass(X, Y) : является ли класс X подклассом класса Y 1. 2. class A(object): pass class B(A): pass 3. 4. 5. 6. 7. 8. issubclass(A, object) #True issubclass(B, A) #True issubclass(B, object) #True issubclass(A, str) #False issubclass (A, A) #True Наследование 1. 2. 3. 4. class A(object): pass class B(A): pass print B.__mro__ #(<class '__main__.B'>, <class '__main__.A'>, <type 'object'>) Атрибут __mro__ – для «новых» классов: method resolution order (порядок разрешения методов ) Полиморфизм - взаимозаменяемость объектов с одинаковым интерфейсом 1. 2. 3. 4. 5. 6. 7. a = (1, 2, 3) b = [ ' a ' , ' b ' , ' c ' ] c = {1 : ' hello ' , 2 : ' world ' } ls = [a, b, c] for x in ls: print x[1], # 2 b hello Полиморфизм - возможность использования одного и того же имени операции (метода) к объектам разных классов. 1. 2. 3. 4. 5. 6. 7. class T1: n=10 def total(self,N): self.total = int(self.n) + int(N) class T2: def total(self,s): self.total = len(str(s)) 8. 9. 10. 11. 12. 13. t1 = T1() t2 = T2() t1.total(45) t2.total(45) print t1.total, t2.total # 55 2 Duck Typing «If it looks like a duck and quacks like a duck, it must be a duck.» 1. 2. 3. def f(x): return x.get_value() # можно передавать объект любого типа, лишь бы у него был метод get_value() Дополнительно 1. 2. class Car(object): pass c = Car() 3. 4. print c # <__main__.Car object at 0x041D6BD0> 5. 6. 7. 8. print Car # <class '__main__.Car'> print type(c) # <class '__main__.Car'> print c.__class__ # <class '__main__.Car'> 9. 10. 11. 12. print type(Car) # <type 'type'> print type(type(c)) # <type 'type'> print Car.__class__ # <type 'type'> 13. 14. print Car.__bases__ # (<type 'object'>,) 15. 16. 17. print type(type(Car)) # <type 'type'> print type(Car).__bases__ # (<type 'object'>,) Материалы по теме ООП http://younglinux.info/oopython/oop.php http://www.ibm.com/developerworks/ru/library/lpython_part_6/index.html http://en.wikibooks.org/wiki/Python_Programming/Objectoriented_programming http://www.cafepy.com/article/python_types_and_objectshttp:/ /www.cafepy.com/article/python_attributes_and_methods/ http://docs.python.org/tutorial/classes.html