Объектно-ориентированное программирование на 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.
Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *