Чтение онлайн

на главную - закладки

Жанры

Язык программирования Python
Шрифт:

True

>>> issubclass(A, str)

False

>>> issubclass(A, A) # класс является подклассом самого себя

True

В основе построения классификации всегда стоит принцип, играющий наиболее важную роль в анализируемой и моделируемой системе. Следует заметить, что одним из «перегибов» при использовании ОО методологии является искусственное выстраивание иерархии классов. Например, не стоит наследовать класс Машина от класса Колесо (внимательные заметят, что здесь отношение другое: колесо

является частью машины).

Класс называется абстрактным, если он предназначен только для наследования. Экземпляры абстрактного класса обычно не имеют большого смысла. Классы с рабочими экземплярами называются конкретными.

В Python примером абстрактного класса является встроенный тип basestring, у которого есть конкретные подклассы str и unicode.

Множественное наследование

В отличие, например, от Java, в языке Python можно наследовать класс от нескольких классов. Такая ситуация называется множественным наследованием (multiple inheritance).

Класс, получаемый при множественном наследовании, объединяет поведение своих надклассов, комбинируя стоящие за ними абстракции.

Использовать множественное наследование следует очень осторожно, а необходимость в нем возникает реже одиночного.

Множественное наследование можно применить для получения класса с заданными общедоступными методами, причем методы задает один родительский класс, а реализуются они на основе методов второго класса. Первый класс может быть полностью абстрактным.

Множественное наследование применяется для добавления примесей (mixins). Примесь — специально сконструированный класс, добавляющий в некоторый класс какую–либо черту поведения (привнесением атрибутов). Примеси обычно являются абстрактными классами.

Изредка множественное наследование применяется в своем основном смысле, когда объекты класса, получающегося в результате множественного наследования, предназначаются для использования в качестве объектов всех родительских классов.

В случае с Python наследование можно считать одним из способов собрать нужные комбинации методов в серии классов:

Листинг

class A:

def a(self): return 'a'

class B:

def b(self): return 'b'

class C:

def c(self): return 'c'

class AB(A, B):

pass

class BC(B, C):

pass

class ABC(A, B, C):

pass

Впрочем, собрать нужные методы можно и по–другому, без использования наследования:

Листинг

def ma(self): return 'a'

def mb(self): return 'b'

def mc(self): return 'c'

class AB:

a = ma

b = mb

class BC:

b = mb

c = mc

class ABC:

a = ma

b = mb

c = mc

Порядок разрешения методов

В случае, когда

надклассы имеют одинаковые методы, использование того или иного метода определяется порядком разрешения методов (method resolution order). Для «новых» классов узнать этот порядок очень просто с помощью атрибута __mro__:

Листинг

>>> str.__mro__

(<type 'str'>, <type 'basestring'>, <type 'object'>)

Это означает, что сначала методы ищутся в классе str, затем в basestring, а уже потом — в object.

Для «классических» классов порядок несколько отличается от порядка разрешения методов в «новых» классах. Нужно стараться избегать множественного наследования или применять его очень аккуратно.

Агрегация

Контейнеры

Под контейнером обычно понимают объект, основным назначением которого является хранение и обеспечение доступа к другим объектам. Контейнеры реализуют отношение «HAS–A» («ИМЕЕТ») между объектами. Встроенные типы, список и словарь — яркие примеры контейнеров. Можно построить собственные типы контейнеров, которые будут иметь свою логику доступа к хранимым объектам. В контейнере хранятся не сами объекты, а ссылки на них.

Для практических нужд в Python обычно хватает встроенных контейнеров (словаря и списка), но если это необходимо, можно создать и другие. Ниже приведен класс Стек, реализованный на базе списка:

Листинг

class Stack:

def __init__(self):

«"«Инициализация стека»""

self._stack = []

def top(self):

«"«Возвратить вершину стека (не снимая)»""

return self._stack[-1]

def pop(self):

«"«Снять со стека элемент»""

return self._stack.pop

def push(self, x):

«"«Поместить элемент на стек»""

self._stack.append(x)

def __len__(self):

«"«Количество элементов в стеке»""

return len(self._stack)

def __str__(self):

«"«Представление в виде строки»""

return " : ".join(["%s» % e for e in self._stack])

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

Листинг

>>> s = Stack

>>> s.push(1)

>>> s.push(2)

>>> s.push(«abc»)

>>> print s.pop

abc

>>> print len(s)

2

>>> print s

1 : 2

Таким образом, контейнеры позволяют управлять набором (любых) других объектов в соответствии со структурой их хранения, не вмешиваясь во внутренние дела объектов. Узнав интерфейс класса Stack, можно и не догадаться, что он реализован на основе списка, и каким именно образом он реализован с помощью него. Но для использования стека это не важно.

Примечание:

В данном примере для краткости изложения не учтено, что в результате некоторых действий могут возбуждаться исключения. Например, при попытке снять элемент с вершины пустого стека.

Поделиться:
Популярные книги

"Фантастика 2025-31". Компиляция. Книги 1-27

Трофимов Ерофей
Фантастика 2025. Компиляция
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
фэнтези
5.00
рейтинг книги
Фантастика 2025-31. Компиляция. Книги 1-27

С чего все началось?

Katelyn
Любовные романы:
современные любовные романы
3.40
рейтинг книги
С чего все началось?

Бастард

Осадчук Алексей Витальевич
1. Последняя жизнь
Фантастика:
фэнтези
героическая фантастика
попаданцы
5.86
рейтинг книги
Бастард

Ты - наша

Зайцева Мария
1. Наша
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Ты - наша

Стая

Сергеева Оксана Николаевна
1. Стая
Любовные романы:
современные любовные романы
остросюжетные любовные романы
9.37
рейтинг книги
Стая

Крым 1944. Весна освобождения

Ткаченко Сергей Николаевич
Военные тайны XX века
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Крым 1944. Весна освобождения

Поварское искусство

Зеленко П. М.
Дом и Семья:
кулинария
6.25
рейтинг книги
Поварское искусство

Тринадцатый

NikL
1. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
7.33
рейтинг книги
Тринадцатый

"Космические циклы романов". Компиляция. Книги 1-49

Тарарев Юрий
Антология фантастики
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Космические циклы романов. Компиляция. Книги 1-49

Очерки истории цивилизации

Уэллс Герберт Джордж
Научно-образовательная:
история
5.75
рейтинг книги
Очерки истории цивилизации

Заговор Аквитании

Ладлэм Роберт
Детективы:
политические детективы
5.00
рейтинг книги
Заговор Аквитании

История политических и правовых учений. Учебник

Коллектив авторов
Научно-образовательная:
история
юриспруденция
5.00
рейтинг книги
История политических и правовых учений. Учебник

Александр Македонский. Трилогия

Рено Мэри
2. В лабиринтах истории
Приключения:
исторические приключения
6.25
рейтинг книги
Александр Македонский. Трилогия

Калейдоскоп.В Игре брода нет(Водовороты Игры)

Пешкова Наталья
2. Калейдоскоп. Все грани Игры
Фантастика:
фэнтези
7.14
рейтинг книги
Калейдоскоп.В Игре брода нет(Водовороты Игры)