Материал: Разработка программных пакетов на языке Python. учебное пособие. Амоа К.А., Рындин Н.А

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

В листинге ниже приведен пример создания класса, который содержит конструктор.

# Создаем класс class MyClass:

# Конструктор def __init__(self):

# Присваивается значение полю self.number= 0

# Отображается сообщение

print ("Coздaн экземпляр класса!")

#Создается э кземпляр класса obj = MyClass ()

#Проверяем значение поля экземпляра класса print("Значение пoля :" , obj.number)

Конструктор экземпляра класса

При выполнении программного кода получаем такой результат:

Создан экземпляр класса! Значение поля: 0

Вклассе MyClass описан конструктор __init__() с одним аргументом self (в случае конструктора это ссылка на создаваемый экземпляр класса). В теле конструктора командой self.number=0 полю number экземпляра класса присваивается нулевое значение, а затем командой print (''Создан экземпляр класса !'') в окне вывода отображается сообщение.

Эти два действия запрограммированы в конструкторе, который, напомним, автоматически вызывается при создании экземпляра класса. Поэтому каждый раз, когда создается экземпляр, этому экземпляру автоматически будет добавляться поле number с нулевым значением, и после этого, опять же автоматически, будет появляться сообщение в окне вывода. Поэтому при создании экземпляра obj командой obj =MyClass() у этого экземпляра появляется поле number, и этому полю присваивается значение 0. Также окне вывода появится сообщение Создан экземпляр класса ! . С помощью команды print("Значение поля : " , obj.number) мы проверяем, справедливы ли все те утверждения относительно поля number экземпляра obj , которые были сделаны выше. Результат выполнения этой команды не дает поводов для сомнений. У конструктора может быть несколько аргументов (во всяком случае, больше одного).

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

45

# Создаем класс class MyClass:

# Метод для присваивания значения полю def set(self , n ) :

# Полю number присваивается значение self.num =n

# Метод для отображения значения поля def get (self) :

# Отображается значение поля number

рrint ( " Значение пoля : " , s e l f . num )

#Конструктор с двумя аргументами

#у второго аргумента есть значение

#по умолчанию

def __init__(self, n=0) :

#Вызывается метод set() для присваивания

#значения полю number

self.set( n)

# Отображается сообщение print ("Coздaн экземпляр класса.")

#Вызывается метод get() для отображения

#значения поля number

self.get(n)

#Создается экземпляр класса a=MyClass()

#Создается еще один экземпляр класса b=MyClass(100)

Аргументы конструктора

Здесь мы создаем класс МуСlass, в теле которого описаны методы экземпляра класса set() и get(). Первый метод предназначен для присваивания значения полю number экземпляра класса, а второй метод нужен для отображения значения этого поля. У конструктора теперь два аргумента. Первый, как всегда, является ссылкой на экземпляр класса, а второй аргумент по нашей задумке, определяет значение поля number экземпляра класса. Причем этот второй аргумент имеет нулевое значение по умолчанию: то есть если при создании экземпляра аргумент указать, то это будет значение поля number, а если значение не указать, то у поля number будет нулевое значение.

Результат выполнения кода такой:

Создан экземпляр класса. Значение поля: 0 Создан экземпляр класса.

Значение поля: 100

46

Возникает вопрос: а как передать аргумент конструктору? Очень просто: в команде создания экземпляра класса после имени класса в круглых скобках (которые до этого у нас всегда были пустыми) передаются аргументы конструктору. Другими словами, шаблон команды создания экземпляра класса с передачей аргументов конструктору такой: переменная=класс(аргументы). Что касается данного конкретного случая, то поскольку второй аргумент имеет значение по умолчанию, мы можем как передавать аргумент конструктору, так и не передавать.

Примером первой ситуации является команда b=MyClass(100) (экземпляр b создается со значением 100 для поля number), а второй – команда a=MyClass() (экземпляр а создается со значением 0 для поля number).

Метод с названием __del__() автоматически вызывается при удалении экземпляра класса из памяти. Этот метод принято называть деструктором. У деструктора один и только один аргумент (ссылка на экземпляр класса self). Небольшой пример с использованием деструктора приведен в листинге:

# Класс с конструктором и деструктором class MyClass:

# Конструктор def __init__(self):

print ( "Bceм привет !" )

# Деструктор def __del__(self) :

print ( "Bceм пока !" )

print("Проверяем работу деструктора.")

#Создаем экземпляр класса obj =MyClass()

print("Экземпляр класса создан. Удаляем его")

#Удаляем экземпляр класса

del(obj)

print("Выполнение программы завершено.")

Результат выполнения программного кода:

Проверяем работу деструктора. Bceм привет !

Экземпляр класса создан. Удаляем его.

Bceм пока !

Выполнение программы завершено.

Хотя вся эта схема с использованием деструктора выглядит довольно элегантно, у нее есть существенный недостаток, причем касается он не только рассмотренного примера, но деструкторов вообще. Дело в том, что очистка памяти в Python выполняется автоматически. Удаляются объекты, на которые в программе нет ссылок. Но сказать, когда конкретно они будут удалены практически невозможно. Поэтому если некоторый объект должен быть удален, то он рано или поздно будет удален. Но когда именно – вопрос сложный.

47

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

5.2. Поле объекта класса

Сейчас самое время вспомнить, что класс сам по себе является объектом. Точно так же, как реальным объектом является лист бумаги, на котором выполнен чертеж автомобиля. До этого мы, образно выражаясь, имели дело с постройкой "автомобилей". Сейчас более пристально посмотрим на тот "чертеж", с которого все началось.

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

С точки зрения прикладного программирования для нас на Данный момент важны два обстоятельства:

В теле класса можно присвоить значение переменной (поле класса). Обращаться к такой переменной следует так: указывается имя класса, и,

через точку, имя переменной.

В листинге ниже представлен программный код, который в некоторой степени позволят понять разницу между полем объекта класса и полем экземпляра класса.

# Создаем класс class MyClass:

# Поле класса

name= " Kлacc MyClass"

#Метод для присваивания значения

#полю экземпляра класса

def set(self, n ) : self.nickname=n

# поля экземпляра класса def get(self) :

рrint (" Значение пoля: " , self.nickname )

# Конструктор

def __init__( self, n ) :

# Полю экземпляра класса self.set ( n )

48

#Отображается сообщение print("Coздaн экземпляр класса.")

#Отображается значение поля экземпляра self.get ( )

#Создается первый экземпляр класса green=MyClass("Зeлeный")

#Обращение к полю класса через экземпляр класса

рrint ("Принадлежность: ", grееn.nаmе)

#Создается второй экземпляр класса

red=MyClass (" Красный " )

#Обращение к полю класса через экземпляр класса

рrint( " Принадлежность: " , red.name )

#Полю класса присваивается значение

MyClass.name= " Здесь могла быть ваша реклама!"

#Обращение к полю класса через экземпляр класса

рrint ("Спрашивает Kpacный: ", red.name )

#Обращение к полю класса через экземпляр класса

рrint (" Спрашивает Зеленый : " , grееn.nаmе)

Поле объекта класса

При выполнении данного программного кода получаем следующий результат:

Создан экземпляр класса Значение поля: Зеленый

Принадлежность: Класс MyClass

Создан экземпляр класса. Значение поля: Красный Принадлежность: Класс MyClass

Спрашивает Красный: Здесь могла быть Ваша реклама!

Спрашивает Зеленый: Здесь могла быть Ваша реклама!

Проанализируем особенности программного кода. В теле класса MyClass, кроме объявления двух методов и конструктора, есть команда name= "Kлacc MyClass", которой фактически создается поле name класса MyClass, и этому полю присваивается текстовое значение "Класс MyClass". Метод set () предназначен для присваивания значения полю экземпляра класса nickname. С помощью метода get() значение поля nickname экземпляра класса отображается в окне вывода. Также в классе описан конструктор. При выполнении кода конструктора полю nickname экземпляра класса присваивается значение аргумента, переданного конструктору, отображается сообщение о создании экземпляра класса и значение поля nickname. На этом код клacca MyClass в принципе исчерпан. Далее в программе идут команды, в которых создаются экземпляры класса и выполняются различные манипуляции с полем name

класса MyClass.

49

Источник: https://studfile.net/preview/16565614/