Объектно-ориентированное программирование. Язык Python

Содержание

Слайд 2

Зачем скрывать внутреннее устройство? Объектная модель задачи: интерфейсы защита внутренних данных

Зачем скрывать внутреннее устройство?

Объектная модель задачи:

интерфейсы

защита внутренних данных
проверка входных данных на

корректность
изменение устройства с сохранением интерфейса

Инкапсуляция («помещение в капсулу») – скрытие внутреннего устройства объектов.

Слайд 3

Защита внутренних данных метод есть + энергия + настроение - голод

Защита внутренних данных

метод есть
+ энергия
+ настроение
- голод

метод спать

+ энергия
+ голод

метод играть
- энергия
+ настроение
+ голод

состояние

методы

Слайд 4

class TPen: def __init__ ( self ): self.__color = "000000" Пример:

class TPen:
def __init__ ( self ):
self.__color = "000000"

Пример:

класс «перо»

class TPen:
def __init__ ( self ):
self.color = "000000"

R

G

B

__color

Слайд 5

Пример: класс «перо» class TPen: def __init__ ( self ): self.__color

Пример: класс «перо»

class TPen:
def __init__ ( self ):
self.__color =

"000000"
def getColor ( self ):
return self.__color
def setColor ( self, newColor ):
if len(newColor) != 6:
self.__color = "000000"
else:
self.__color = newColor

def getColor ( self ):
return self.__color

def setColor ( self, newColor ):
if len(newColor) != 6:
self.__color = "000000"
else:
self.__color = newColor

если ошибка, чёрный цвет

метод чтения

метод записи

Слайд 6

Пример: класс «перо» Использование: pen = TPen() pen.setColor ( "FFFF00" )

Пример: класс «перо»

Использование:

pen = TPen()
pen.setColor ( "FFFF00" )
print ( "цвет пера:",

pen.getColor() )

установить цвет

прочитать цвет

pen.color = "FFFF00"
print ( "цвет пера:", pen.сolor )

Слайд 7

Свойство color class TPen: def __init__ ( self ): ... def

Свойство color

class TPen:
def __init__ ( self ):
...
def __getColor

( self ):
...
def __setColor ( self, newColor ):
...
color = property ( __getColor,
__setColor )

Свойство – это способ доступа к внутреннему состоянию объекта, имитирующий обращение к его внутренней переменной.

color = property ( __getColor,
__setColor )

свойство

метод чтения

метод записи

pen.color = "FFFF00"
print ( "цвет пера:", pen.сolor )

Слайд 8

Изменение внутреннего устройства class TPen: def __init__ ( self ): self.__color

Изменение внутреннего устройства

class TPen:
def __init__ ( self ):
self.__color =

0
def __getColor ( self ):
return "{:06x}".format ( self.__color )
def __setColor ( self, newColor ):
if len(newColor) != 6:
self.__color = 0
else:
self.__color = int ( newColor, 16 )
color = property (__getColor, __setColor)

Удобнее хранить цвет в виде числа:

число

число

число

Слайд 9

Преобразование int → hex Целое – в шестнадцатеричную запись: "0000FF" правильно

Преобразование int → hex

Целое – в шестнадцатеричную запись:

"0000FF"

правильно так!

16711935 → "FF00FF"


x = 16711935
sHex = "{:x}".format(x)

x = 16711935
sHex = "{:06x}".format(x)

в шестнадцатеричной системе

дополнить нулями слева

занять 6 позиций

Слайд 10

Преобразование hex → int "FF00FF" → 16711935 sHex = "FF00FF" x

Преобразование hex → int

"FF00FF" → 16711935

sHex = "FF00FF"
x = int (

sHex, 16 )

система счисления

Слайд 11

Свойство «только для чтения» class TCar: def __init__ ( self ):

Свойство «только для чтения»

class TCar:
def __init__ ( self ):
self.__v

= 0
v = property ( lambda x: x.__v )

нет метода записи

Скорость машины можно только читать:

Слайд 12

Скрытие внутреннего устройства Инкапсуляция («помещение в капсулу») интерфейс (public) внутреннее устройство (private)

Скрытие внутреннего устройства

Инкапсуляция («помещение в капсулу»)

интерфейс (public)

внутреннее устройство (private)

Слайд 13

Задание «A»: Построить класс РядЛампочек (LampRow), который хранит состояние ряда из

Задание

«A»: Построить класс РядЛампочек (LampRow), который хранит состояние ряда из 8

лампочек в виде символьной строки. Цифра 0 обозначает выключенную лампочку, цифра 1 – включенную.
Свойство state скрывает внутреннюю переменную __state, которая хранит состояние лампочек. При записи нового значения проверяется, что длина строки состояния равна 8, иначе записываются все нули.
Метод show выводит на экран состояние лампочек, обозначая выключенную лампочку как минус, а включённую – как «*».
Пример:
lamps = LampRow()
lamps.show() --------
lamps.state = "10101010"
print( lamps.state ) 10101010
lamps.show() *-*-*-*-
Слайд 14

Задание «B»: Дополните класс LampRow из задания A так, чтобы количество

Задание

«B»: Дополните класс LampRow из задания A так, чтобы количество лампочек

в цепочке можно было задавать в конструкторе.
Пример:
lamps = LampRow( 6 )
lamps.show() ------
lamps.state = "101010"
print( lamps.state ) 101010 lamps.show() *-*-*-
lamps.state = "10101010" # ошибка
print( lamps.state ) 000000 lamps.show() ------
Слайд 15

Задание «С»: Дополните класс LampRow из задания B так, чтобы лампочки

Задание

«С»: Дополните класс LampRow из задания B так, чтобы лампочки могли

гореть одним из двух цветов – красный цвет имеет код 1 и обозначается при выводе как «*», а зелёный цвет имеет код 2 и обозначается как «о».
Пример:
lamps = LampRow( 6 )
lamps.show() ------
lamps.state = "102102"
print( lamps.state ) 102102 lamps.show() *-o*-o
lamps.state = "10201010" # ошибка
print( lamps.state ) 000000 lamps.show() ------
Слайд 16

Задание «D»: Дополните класс LampRow из задания C так, чтобы код

Задание

«D»: Дополните класс LampRow из задания C так, чтобы код состояния

хранился как целое число. При этом интерфейс (способ чтения и записи свойства state) не должен измениться.
Пример:
lamps = LampRow( 6 )
lamps.show() ------
lamps.state = "102102"
print( lamps.state ) 102102 lamps.show() *-o*-o*
lamps.state = "10201010" # ошибка
print( lamps.state ) 000000 lamps.show() ------