При внесении нового типа объекта изменения в ОО–программе затрагивают только один модуль, а в процедурной — все процедуры:
# ООП
class D:
def a(): ...
def b(): ...
def c(): ...
# процедурный подход
def a(x):
if type(x) is A: ...
if type(x) is B: ...
if type(x) is C: ...
if type(x) is D: ...
def b(x):
if type(x) is A: ...
if type(x) is B: ...
if type(x) is C: ...
if type(x) is D: ...
def c(x):
if type(x) is A: ...
if type(x) is B: ...
if type(x) is C: ...
if type(x) is D: ...
И наоборот, теперь нужно добавить новый метод обработки. При процедурном подходе просто пишется новая процедура, а вот для объектного приходится изменять все классы:
# процедурный подход
def d(x):
if type(x) is A: ...
if type(x) is B: ...
if type(x) is C: ...
# ООП
class A:
def a(): ...
def b(): ...
def c(): ...
def d(): ...
class B:
def a(): ...
def b(): ...
def c(): ...
def d(): ...
class C:
def a(): ...
def b(): ...
def c(): ...
def d(): ...
Язык программирования Python изначально был ориентирован на практические нужды. Приведенное выше выражается в стандартной библиотеке Python, то есть в том, что там применяются и функции (обычно сильно обобщенные на довольно широкий круг входных данных), и классы (когда операции достаточно специфичны). Обобщенная природа функций Python и полиморфизм, не завязанный целиком на наследовании — вот свойства языка Python, позволяющие иметь большую гибкость в комбинации процедурного и объектно–ориентированного подходов.
Заключение
Даже достаточно неформальное введение в ООП потребовало определения большого количества терминов. В лекции была сделана попытка с помощью примеров передать не столько букву, сколько дух терминологии ООП. Были рассмотрены все базовые понятия: объект, тип, класс и виды отношений между объектами (IS–A, HAS–A, USE–A). Слушатели получили представление о том, что такое инкапсуляция и полиморфизм в стиле ООП, а также наследование — продление времени жизни объекта за рамками исполняющейся программы, известное как устойчивость объекта (object persistence). Были указаны недостатки ООП, но при этом весь предыдущий материал объективно свидетельствовал о достоинствах этого подхода.
Возможно, что именно эта лекция приведет слушателей к пониманию ООП, пригодному и удобному для практической работы.
Ссылки
Дэвид Мертц http://www-106.ibm.com/developerworks/linux/library/l-pymeta.html
Лекция #5: Численные алгоритмы. Матричные вычисления.
В данной лекции рассматривается пакет Numeric для осуществления численных расчетов и выполнения матричных вычислений, приводится обзор других пакетов для научных вычислений.
Numeric Python — это несколько модулей для вычислений с многомерными массивами, необходимых для многих численных приложений. Модуль Numeric вносит в Python возможности таких пакетов и систем как MatLab, Octave (аналог MatLab), APL, J, S+, IDL. Пользователи найдут Numeric достаточно простым и удобным. Стоит заметить, что некоторые синтаксические возможности Python (связанные с использованием срезов) были специально разработаны для Numeric.
Numeric Python имеет средства для:
• матричных вычислений LinearAlgebra
;
• быстрого преобразования Фурье FFT
;
• работы с недостающими экспериментальными данными MA
;
• статистического моделирования RNG
;
• эмуляции базовых функций программы MatLab.
Модуль Numeric
Модуль Numeric
определяет полноценный тип–массив и содержит большое число функций для операций с массивами. Массив — это набор однородных элементов, доступных по индексам. Массивы модуля Numeric
могут быть многомерными, то есть иметь более одной размерности.
Создание массива
Для создания массива можно использовать функцию array()
с указанием содержимого массива (в виде вложенных списков) и типа. Функция array()
делает копию, если ее аргумент — массив. Функция asarray()
работает аналогично, но не создает нового массива, когда ее аргумент уже является массивом:
>>> from Numeric import *
>>> print array([[1, 2], [3, 4], [5, 6]])
[[1 2]
[3 4]
[5 6]]
>>> print array([[1, 2, 3], [4, 5, 6]], Float)
[[ 1. 2. 3.]