3.1 Создание класса
Создание классов в Python — важная часть объектно-ориентированного программирования (ООП). Классы позволяют создавать новые типы данных, которые могут иметь свои собственные атрибуты и методы. Давайте рассмотрим основные понятия и примеры создания классов в Python.
Основные понятия
- Класс: шаблон для создания объектов. Класс определяет атрибуты и методы, которые будут у объектов этого класса.
- Объект: экземпляр класса. Объект обладает всеми атрибутами и методами, определёнными в классе.
- Атрибут: переменная, связанная с классом или объектом.
- Метод: функция, связанная с классом или объектом.
Атрибуты — это, по сути, внутренние переменные объекта или класса. Методы — это функции, определённые внутри класса. Эти термины пришли из ООП и используются наравне с функциями и переменными.
Для объявления (создания) нового класса используется ключевое слово class. Общий синтаксис этой операции выглядит так:
class ИмяКласса:
переменная1 = значение1
переменнаяN = значениеN
def функция1(self):
код функции
def функцияM(self):
код функции
В принципе, можно сказать, что класс — это небольшая программа (переменные + функции), помещённая в отдельную поименованную область — ИмяКласса.
После того как вы создали класс, вы можете создавать объекты (экземпляры) этого класса. Этот код выглядит ещё проще:
переменнаяХ = ИмяКласса()
Важно! Имена переменных и методов в Python принято писать с маленькой буквы. Имена классов — с большой. Также при написании имён классов не используются символы подчеркивания. Если имя класса должно состоять из нескольких слов, то каждое из них пишется с большой буквы.
Если вы хотите обратиться к переменной класса/объекта, то обычно этот код выглядит так:
переменнаяХ.переменная1 = 10
переменнаяХ.функцияM()
Но тут не без нюансов, о которых ниже…
3.2 Работа с объектом
И класс, и экземпляр класса (объект класса) являются объектами, поэтому и у первого, и у второго могут быть свои переменные и методы.
Существуют два типа переменных:
- Атрибут/Переменная/Поле класса
(class property) - Атрибут/Переменная/Поле объекта
(object property)
И целых три типа методов:
- Метод/Функция класса
(class method) - Метод/Функция объекта
(instance method) - Статический метод
(static method)
Методы отличаются способом своего объявления и тем, как они вызываются.
Методы объекта
При объявлении метода объекта в него нужно передать первый обязательный параметр — self. При вызове метода в этот параметр передаётся ссылка на объект (instance).
class MyClass:
def instance_method(self):
print(type(self)) # <class 'MyClass'>
my_object = MyClass()
my_object.instance_method()
В примере выше, когда начала выполняться функция instance_method(), в параметр self была передана ссылка на объект my_object.
Методы класса
При объявлении метода класса в него тоже нужно передать первый обязательный параметр — cls. При вызове метода в этот параметр передаётся ссылка на класс (class object). Также метод класса нужно пометить декоратором classmethod, как в примере ниже:
class MyClass:
def instance_method(self):
print(type(self)) # <class 'MyClass'>
@classmethod
def class_method(cls):
print(type(cls)) # <class 'type'>
my_object = MyClass()
my_object.instance_method()
MyClass.class_method()
В примере выше, когда начала выполняться функция class_method(), в параметр cls была передана ссылка на класс MyClass.
Статический метод
При объявлении статического метода в него ничего не нужно передавать, но он и не сможет обращаться к внутренним данным класса. Также метод нужно пометить декоратором staticmethod, как в примере ниже:
class MyClass:
def instance_method(self):
print(type(self)) # <class 'MyClass'>
@classmethod
def class_method(cls):
print(type(cls)) # <class 'type'>
@staticmethod
def static_method():
return "Этот метод не зависит от экземпляра или класса"
my_object = MyClass()
my_object.instance_method()
MyClass.class_method()
MyClass.static_method()
Статический метод вызывается очень похоже на метод класса, но ни ссылка на объект, ни ссылка на класс в него не передаются.
3.3 Переменные класса
Переменные класса
Для того чтобы объявить переменную (атрибут) класса, её нужно просто объявить в любом месте внутри класса. Обычно это делают в самом начале, до объявления методов класса. Пример:
class MyClass:
attribute = "Я атрибут класса"
@classmethod
def class_method(cls):
print(cls.attribute) # Я атрибут класса
my_object = MyClass()
MyClass.class_method()
Если вы хотите прочитать или записать значение в переменную класса, то используйте объект cls.
В принципе, к переменной класса можно обратиться и через имя класса:
class MyClass:
attribute = "Я атрибут класса"
@classmethod
def class_method(cls):
print(MyClass.attribute) # Я атрибут класса
my_object = MyClass()
print(MyClass.attribute) # Я атрибут класса
Переменные/поля объекта
Переменные объекта (instance) — это поля объекта self. Вы просто работаете с ними через self.name. Именно для этого объект self и передаётся в каждый метод объекта.
Пример:
class MyClass:
attribute = "Я атрибут класса"
def set_name(self, name):
self.name = name
def print_name(self):
print(self.name)
my_object = MyClass()
my_object.set_name("Поле объекта по имени name")
my_object.print_name() # "Поле объекта по имени name"
Каждый раз, когда вы вызываете метод объекта, в качестве первого параметра (self) передаётся ссылка на объект, у которого вы и вызываете метод. Разные методы объекта могут обращаться к общим данным через использование объекта self.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ