Объектно-ориентированное программирование с помощью Python [Ирв Кальб] (pdf) читать постранично, страница - 87

-  Объектно-ориентированное программирование с помощью Python  11.15 Мб, 515с. скачать: (pdf) - (pdf+fbd)  читать: (полностью) - (постранично) - Ирв Кальб

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]

наследование

клавиши, код вызывает метод handleEvent() базового класса
InputText, чтобы выполнить все необходимое с этой клавишей
(отобразить или отредактировать поле).
Когда пользователь нажимает Return или Enter, клиентский код вызывает метод getValue(), чтобы получить ввод
пользователя. Метод getValue() в этом классе вызывает
getValue() в классе InputText, чтобы получить строку
из поля, затем пытается преобразовать эту строку в число. Если
это преобразование не удается, он вызывает исключение.
Переопределяя методы, мы создали очень эффективный новый класс многократного использования, который расширяет
функциональные возможности класса InputText, не меняя при
этом ни единой строки в базовом классе. InputText продолжит
функционировать как класс сам по себе без каких-либо изменений его функциональных возможностей.
DisplayMoney
В качестве второго примера из реального мира мы создадим
поле для отображения суммы денег. Для универсальности будем
отображать сумму с выбранным символом валюты, поместим
его слева или справа от текста (в зависимости от обстоятельств) и отформатируем число, добавив запятые между каждыми тремя цифрами, за которыми следует точка и затем две
десятичные цифры. Например, мы хотели бы отобразить
1234,56 доллара США в виде $1234,56.
В пакете pygwidgets уже есть класс DisplayText. Мы можем создать экземпляр объекта из этого класса, используя следующий интерфейс:
def __init__(self, window, loc=(0, 0), value='',
fontName=None, fontSize=18, width=None, height=None,
textColor=PYGWIDGETS_BLACK, backgroundColor=None,
justified='left', nickname=None):

Давайте предположим, что у нас некоторый код, который создает объект DisplayText с именем oSomeDisplayText, используя соответствующие аргументы. Каждый раз, когда хотим
обновить текст в объекте DisplayText, мы должны вызвать метод setValue() следующим образом:
oSomeDisplayText.setValue('1234.56')

Глава 10. Наследование 311

Функциональнее возможности отображения текста (в виде
строки) с помощью объекта DisplayText уже существуют. Мы
хотим создать новый класс с именем DisplayMoney, который
аналогичен DisplayText, но добавляет функциональность, поэтому мы наследуем от DisplayText.
В классе DisplayMoney будет улучшенная версия метода
setValue(), которая переопределяет метод базового класса
setValue(). Версия DisplayMoney внесет необходимое форматирование, добавляя символ валюты, запятые, дополнительно
сокращая до двух десятичных цифр, и так далее. В конце метод
вызовет унаследованный метод setValue() базового класса
DisplayText и передаст версию строки отформатированного
текста для отображения в окне.
Мы также добавим некоторые дополнительные параметры
установки в метод __init__(), чтобы клиентский код:
• выбирал символ валюты (по умолчанию $);
• помещал символ валюты слева или справа (по умолчанию
слева);
• отображал или скрывал два десятичных разряда (по умолчанию отображает).
В листинге 10.4 продемонстрирован код нашего нового класса DisplayMoney.
Файл: MoneyExamples/DisplayMoney.py
# Класс DisplayMoney – отображает число в виде денежной суммы
#
# Демонстрация наследования
import pygwidgets
BLACK = (0, 0, 0)
#
# Класс DisplayMoney наследует от класса DisplayText
#
 class DisplayMoney(pygwidgets.DisplayText):


def __init__(self, window, loc, value=None,
fontName=None, fontSize=24, width=150, height=None,
textColor=BLACK, backgroundColor=None,

312 Часть III. Инкапсуляция, полиморфизм и наследование

justified='left', value=None, currencySymbol='$',
currencySymbolOnLeft=True, showCents=True):






self.currencySymbol = currencySymbol
self.currencySymbolOnLeft = currencySymbolOnLeft
self.showCents = showCents
if value is None:
value = 0.00
# вызываем метод __init__() нашего базового класса
super().__init__(window, loc, value,
fontName, fontSize, width, height,
textColor, backgroundColor, justified)
def setValue(self, money):
if money == '':
money = 0.00
money = float(money)
if self.showCents:
money = '{:,.2f}'.format(money)
else:
money = '{:,.0f}'.format(money)
if self.currencySymbolOnLeft:
theText = self.currencySymbol + money
else:
theText = money + self.currencySymbol



# вызываем метод setValue нашего базового класса
super().setValue(theText)
Листинг 10.4. DisplayMoney отображает число, отформатированное в виде
денежного значения

В определении класса мы явно наследуем от pygwidgets.
DisplayText . Класс DisplayMoney содержит лишь два метода: __init__() и setValue(). Они переопределяют методы
с аналогичными именами в базовом классе.
Клиент создает экземпляр объекта DisplayMoney следующим образом:
oDisplayMoney = DisplayMoney(window, (100, 100), 1234.56)

С помощью этой строки метод __init__() в DisplayMoney 
выполнит и переопределит метод __init__() в базовом классе.
Глава 10. Наследование 313

Он выполняет некоторую инициализацию, включая сохранение любых клиентских предпочтений символов валюты, стороны отображения символа и отображения с точностью до сотых, все в переменных экземпляра . Метод заканчивается
вызовом метода __init__() базового класса DisplayText 
(который он находит, вызывая super()) и передает данные,
требуемые этим методом.
Позднее клиент, чтобы отобразить значение, выполняет вызов следующим образом:
oDisplayMoney.setValue(12233.44)

Метод setValue() в классе DisplayMoney выполняется,
чтобы создать версию суммы денег, отформатированную в виде
значения валюты. Метод завершается вызовом унаследованного метода setValue() в классе DisplayText , чтобы установить новый текст для