2010-10-26_OOP_v1

advertisement
Объектно – ориентированное
программирование
(ООП)
Артишевская Юлия , 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
Download