Объектно-ориентированное программирование на Python — основы
В этом руководстве вы изучите объектно-ориентированное программирование на Python, включая основные понятия, такие как объекты, классы, атрибуты, методы, наследование, переопределение методов и т. д.
- Введение в объектно-ориентированное программирование на Python
- Как определить класс
- Определение атрибутов экземпляра
- Методы экземпляра
- Атрибуты класса
- Как определить метод класса в Python
- Определить статический метод
- Единое наследование
Введение в объектно-ориентированное программирование на Python
Все в Python является объектом. Объект имеет состояние и поведение. Чтобы создать объект, вы сначала определяете класс. И затем из класса вы можете создать один или несколько объектов. Объекты являются экземплярами класса.
Как определить класс
Чтобы определить класс, вы используете ключевое слово class, за которым следует имя класса. Например, следующий код определяет класс Person:
class Person: pass
Чтобы создать объект из класса Person, вы используете имя класса, за которым следуют круглые скобки(), как при вызове функции:
person = Person()
В этом примере person является экземпляром класса Person. Классы можно вызывать.
Определение атрибутов экземпляра
Python динамичен. Это означает, что вы можете добавлять атрибут к экземпляру класса динамически во время выполнения.
Например, следующий код добавляет атрибут name к объекту person:
person.name = 'John'
Однако если вы создадите другой объект Person, у нового объекта не будет атрибута name.
Чтобы определить и инициализировать атрибут для всех экземпляров класса, используйте метод __init__. Ниже определяется класс Person с двумя атрибутами экземпляра name и age:
class Person: def __init__(self, name, age): self.name = name self.age = age
Когда вы создаете объект Person, Python автоматически вызывает метод __init__ для инициализации атрибутов экземпляра. В методе __init__ self является экземпляром класса Person.
Следующий код создает объект Person с именем person:
person = Person('John', 25)
Объект person теперь имеет атрибуты name и age. Чтобы получить доступ к атрибуту экземпляра, вы используете точечную запись. Например, следующая команда возвращает значение атрибута name объекта person:
person.name
Методы экземпляра
Следующий код добавляет в класс Person метод экземпляра, называемый Greeting():
class Person: def __init__(self, name, age): self.name = name self.age = age def greet(self): return f"Hi, it's {self.name}."
Для вызова метода экземпляра вы также используете точечную запись. Например:
person = Person('John', 25) print(person.greet())
Выход:
Hi, it's John
Атрибуты класса
В отличие от атрибутов экземпляра, атрибуты класса являются общими для всех экземпляров класса. Они полезны, если вы хотите определить константы или переменные класса, которые отслеживают количество экземпляров класса.
Например, следующий код определяет атрибут класса counter в классе Person:
class Person: counter = 0 def __init__(self, name, age): self.name = name self.age = age def greet(self): return f"Hi, it's {self.name}."
Вы можете получить доступ к атрибуту counter из класса Person:
Person.counter
Или из любых экземпляров класса Person:
person = Person('John',25) person.counter
Чтобы сделать переменную counter более полезной, вы можете увеличить ее значение на единицу после создания объекта. Для этого вы увеличиваете атрибут класса counter в методе __init__:
class Person: counter = 0 def __init__(self, name, age): self.name = name self.age = age Person.counter += 1 def greet(self): return f"Hi, it's {self.name}."
Следующий пример создает два экземпляра класса Person и показывает значение counter:
p1 = Person('John', 25) p2 = Person('Jane', 22) print(Person.counter)
Выход:
2
Как определить метод класса в Python
Как и атрибут класса, метод класса является общим для всех экземпляров класса. Первым аргументом метода класса является сам класс. По соглашению его имя — cls. Python автоматически передает этот аргумент методу класса. Кроме того, вы используете декоратор @classmethod для украшения метода класса.
В следующем примере определяется метод класса, который возвращает анонимный объект Person:
class Person: counter = 0 def __init__(self, name, age): self.name = name self.age = age Person.counter += 1 def greet(self): return f"Hi, it's {self.name}." @classmethod def create_anonymous(cls): return Person('Anonymous', 22)
Ниже показано, как вызвать метод класса create_anonymous():
anonymous = Person.create_anonymous() print(anonymous.name) # Anonymous
Определить статический метод
Статический метод не привязан к классу или каким-либо экземплярам класса. В Python вы используете статические методы для группировки логически связанных функций в классе. Чтобы определить статический метод, используйте декоратор @staticmethod.
Например, следующий код определяет класс TemperatureConverter, который имеет два статических метода, которые преобразуют градусы Цельсия в градусы Фаренгейта и наоборот:
class TemperatureConverter: @staticmethod def celsius_to_fahrenheit(c): return 9 * c / 5 + 32 @staticmethod def fahrenheit_to_celsius(f): return 5 *(f - 32) / 9
Чтобы вызвать статический метод, используйте синтаксис ClassName.static_method_name(). Например:
f = TemperatureConverter.celsius_to_fahrenheit(30) print(f) # 86
Обратите внимание, что Python не передает неявно ни экземпляр(self), ни класс(cls) в качестве первого аргумента статического метода.
Единое наследование
Класс может повторно использовать другой класс, унаследовав его. Когда дочерний класс наследует родительский класс, дочерний класс может получить доступ к атрибутам и методам родительского класса.
Например, вы можете определить класс Employee, который наследуется от класса Person:
class Employee(Person): def __init__(self, name, age, job_title): super().__init__(name, age) self.job_title = job_title
Внутри метода __init__ класса Employee вызывается метод __init__ класса Person для инициализации атрибутов имени и возраста. Функция super() позволяет дочернему классу получить доступ к методу родительского класса.
Класс Employee расширяет класс Person, добавляя еще один атрибут под названием job_title.
Person является родительским классом, а Employee — дочерним классом. Чтобы переопределить метод greet() в классе Person, вы можете определить метод greet() в классе Employee следующим образом:
class Employee(Person): def __init__(self, name, age, job_title): super().__init__(name, age) self.job_title = job_title def greet(self): return super().greet() + f" I'm a {self.job_title}."
Метод greet() в классе Employee также называется методом greet() класса Person. Другими словами, он делегирует метод родительского класса.
Следующий пример создает новый экземпляр класса Employee и вызывает метод greet():
employee = Employee('John', 25, 'Python Developer') print(employee.greet())
Выход:
Hi, it's John. I'm a Python Developer.