Python3 Объектно-ориентированное программирование
Python был объектно-ориентированным языком с самого начала своего проектирования. Благодаря этому в Python очень легко создавать классы и объекты. В этой главе подробно рассматривается объектно-ориентированное программирование в Python.
Если вы раньше не сталкивались с объектно-ориентированными языками программирования, возможно, вам сначала потребуется понять некоторые базовые особенности объектно-ориентированных языков и сформировать в уме базовое представление об объектной ориентации; это поможет вам легче изучить объектно-ориентированное программирование в Python.
Далее давайте кратко рассмотрим некоторые основные особенности объектной ориентации.
Введение в объектно-ориентированную технологию
- Класс:Используется для описания совокупности объектов с одинаковыми атрибутами и методами. Он определяет атрибуты и методы, общие для каждого объекта в этой совокупности. Объект — это экземпляр класса.
- Метод:Функция, определённая в классе.
- Переменная класса:Переменная класса является общей для всех созданных объектов. Переменные класса определяются в классе и вне тела любой функции. Переменные класса обычно не используются в качестве переменных экземпляра.
- Члены данных:Переменные класса или переменные экземпляра используются для обработки данных, связанных с классом и его объектами-экземплярами.
- Переопределение метода:Если метод, унаследованный от родительского класса, не может удовлетворить потребности дочернего класса, его можно переопределить. Этот процесс называется переопределением метода.
- Локальная переменная:Переменная, определённая в методе, которая влияет только на класс текущего экземпляра.
- Переменная экземпляра:В объявлении класса атрибуты представлены переменными. Такие переменные называются переменными экземпляра. Переменная экземпляра — это переменная, определяемая с помощью self.
- Наследование:То есть производный класс наследует поля и методы базового класса. Наследование также позволяет рассматривать объект производного класса как объект базового класса. Например, существует такой дизайн: объект типа Dog, производный от класса Animal, который моделирует отношение «является» (например, Dog — это Animal).
- Инстанцирование:Создание экземпляра класса, конкретного объекта класса.
- Объект:Экземпляр структуры данных, определённой классом. Объекты включают два члена данных (переменные класса и переменные экземпляра) и методы.
По сравнению с другими языками программирования Python добавил механизм классов, по возможности не добавляя новый синтаксис и семантику.
Классы в Python предоставляют все основные возможности объектно-ориентированного программирования: механизм наследования классов допускает несколько базовых классов, производные классы могут переопределять любой метод базового класса, а методы могут вызывать методы с тем же именем в базовом классе.
Объекты могут содержать любое количество данных любого типа.
Определение класса
Формат синтаксиса следующий:
После создания экземпляра класса можно использовать его атрибуты. Фактически, после создания класса доступ к его атрибутам можно получить через имя класса.
Объекты классов
Объекты классов поддерживают две операции: обращение к атрибутам и создание экземпляра.
Обращения к атрибутам используют тот же стандартный синтаксис, что и все обращения к атрибутам в Python:obj.name。
После создания объекта класса все имена в пространстве имен класса являются допустимыми именами атрибутов. Так что если определение класса выглядит так:
Примеры (Python 3.0+)
Выше был создан новый экземпляр класса, и объект присвоен локальной переменной x, где x — пустой объект.
Вывод выполнения вышеуказанной программы:
MyClass 类的属性 i 为: 12345 MyClass 类的方法 f 输出为: hello world
У класса есть специальный метод с именем __init__() (метод-конструктор), который автоматически вызывается при создании экземпляра класса, как показано ниже:
Если класс определяет метод __init__(), операция создания экземпляра класса автоматически вызовет метод __init__(). Как показано ниже, при создании экземпляра класса MyClass будет вызван соответствующий метод __init__():
x = MyClass()
Конечно, метод __init__() может иметь параметры, и параметры передаются через __init__() в операцию создания экземпляра класса. Например:
Примеры (Python 3.0+)
self представляет экземпляр класса, а не класс
Единственное особое отличие методов класса от обычных функций заключается в том, что они должны иметь дополнительноеимя первого параметра, которое по соглашению называется self.
Результат выполнения приведенного выше примера:
<__main__.Test instance at 0x100771878> __main__.Test
Из результата выполнения ясно видно, что self представляет экземпляр класса, то есть адрес текущего объекта, тогда как self.class указывает на класс.
self не является ключевым словом Python. Если мы изменим его на example, это всё равно будет выполняться нормально:
Результат выполнения приведенного выше примера:
<__main__.Test instance at 0x100771878> __main__.Test
В Python self — это условное имя, используемое для обозначения самого экземпляра (объекта) класса. Это ссылка на экземпляр, позволяющая методам класса получать доступ к атрибутам экземпляра и управлять ими.
Когда вы определяете класс и методы в классе, первый параметр обычно называется self. Хотя можно использовать другие имена, настоятельно рекомендуется использовать self для поддержания согласованности и читаемости кода.
Пример
def __init__(self, value):
self.value = value
def display_value(self):
print(self.value)
# Создать экземпляр класса
obj = MyClass(42)
# Вызвать метод экземпляра
obj.display_value() # Вывод 42
В приведённом выше примере self — это ссылка, указывающая на экземпляр класса. Он используется в__init__-конструкторе для инициализации атрибутов экземпляра, а также вdisplay_value-методах для доступа к атрибутам экземпляра. Используя self, вы можете получать доступ к атрибутам экземпляра и управлять ими в методах класса, тем самым реализуя поведение класса.
Методы класса
Внутри класса используйтеdefключевое слово для определения метода. В отличие от обычных определений функций, методы класса должны включать параметр self, и он должен быть первым параметром. self представляет экземпляр класса.
Примеры (Python 3.0+)
Вывод выполнения вышеуказанной программы:
example 说: 我 10 岁。
Наследование
Python также поддерживает наследование классов. Если язык не поддерживает наследование, классы не имеют смысла. Определение производного класса выглядит следующим образом:
Подкласс (производный класс DerivedClassName) будет наследовать атрибуты и методы родительского класса (базового класса BaseClassName).
BaseClassName (имя базового класса в примере) должно находиться в той же области видимости, что и определение производного класса. Кроме классов, также можно использовать выражения. Это очень полезно, когда базовый класс определён в другом модуле:class DerivedClassName(modname.BaseClassName):
Примеры (Python 3.0+)
Вывод выполнения вышеуказанной программы:
ken 说: 我 10 岁了,我在读 3 年级
Множественное наследование
Python также имеет ограниченную поддержку множественного наследования. Определение класса для множественного наследования выглядит следующим образом:
Обратите внимание на порядок родительских классов в круглых скобках. Если у родительских классов есть метод с одинаковым именем и подкласс не указывает, какой из них использовать, Python выполняет поиск слева направо. То есть, когда метод не найден в подклассе, он проверяет родительские классы слева направо, чтобы узнать, содержат ли они этот метод.
Примеры (Python 3.0+)
Вывод вышеприведённой программы:
我叫 Tim,我是一个演说家,我演讲的主题是 Python
Переопределение методов
Если метод родительского класса не удовлетворяет вашим потребностям, вы можете переопределить метод родительского класса в подклассе. Пример:
Примеры (Python 3.0+)
Функция super()используется для вызова метода родительского класса (суперкласса).
Вывод вышеприведённой программы:
Call subclass method Call superclass method
Дополнительная документация:
Объяснение наследования конструктора родительского класса подклассом в Python
Атрибуты и методы класса
Приватные атрибуты класса
__private_attrs: начинается с двух подчёркиваний, объявляя атрибут приватным. Его нельзя использовать или напрямую обращаться к нему вне класса. При использовании в методах внутри класса...self.__private_attrs。
Методы класса
Внутри класса используйте ключевое слово def, чтобы определить метод. В отличие от обычных определений функций, метод класса должен включать параметрself, и он должен быть первым параметром,selfпредставляющий экземпляр класса.
selfЕго имя не фиксировано; вы также можете использоватьthis, но лучше следовать соглашению.self。
Приватные методы класса
__private_method: начинается с двух подчёркиваний, объявляя метод приватным. Его можно вызвать только внутри класса, но не вне класса.self.__private_methods。
Пример
Ниже приведён пример приватных атрибутов класса:
Примеры (Python 3.0+)
Вывод вышеприведённой программы:
1
2
2
Traceback (most recent call last):
File "test.py", line 16, in <module>
print (counter.__secretCount) # 报错,实例不能访问私有变量
AttributeError: 'JustCounter' object has no attribute '__secretCount'
Ниже приведён пример приватных методов класса:
Примеры (Python 3.0+)
Результат выполнения приведённого выше примера:

Специальные методы класса:
- __init__ :Конструктор, вызывается при создании объекта
- __del__ :Деструктор, используется при освобождении объекта
- __repr__ :Печать, преобразование
- __setitem__ :Присваивание по индексу
- __getitem__:Получение значения по индексу
- __len__:Получение длины
- __cmp__:Операция сравнения
- __call__:Вызов функции
- __add__:Операция сложения
- __sub__:Операция вычитания
- __mul__:Операция умножения
- __truediv__:Операция деления
- __mod__:Операция взятия остатка
- __pow__:Возведение в степень
Перегрузка операторов
Python также поддерживает перегрузку операторов. Мы можем перегружать специальные методы класса. Пример:
Примеры (Python 3.0+)
Результат выполнения приведённого выше кода следующий:
Vector(7,8)Другие расширения