Как вернуть объект класса python
Перейти к содержимому

Как вернуть объект класса python

  • автор:

Возвращение класса Python

Зачем нам нужно писать return CLASS_NAME? Когда и зачем нужно возвращать класс?

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

Константин's user avatar

Ну вот вам искусственный пример, в котором возвращается и используется класс:

В переменной c получается случайным образом либо класс A , либо класс B , и мы вызываем функцию этого класса, не зная, какой у нас класс, нам всё-равно, у них у обоих есть эта функция.

В вашем же примере возвращается экземпляр класса , это практически тоже самое, что в моём примере, но у вас получается как бы настроенный класс. Т.е. класс то вы возвращаете один и тот же, но поведение у него может быть разное в зависимости от инициализации класса. Опять же пример:

У вас в примере нет возврата класса: Note(. ) — это создание нового объекта вашего класса.

Зачем тут создается этот объект:

В результате применения оператора (оператора сдвига в данном случае) обычно получается объект (новый или уже существующий) того же класса, что и изначальный объект: по аналогии, если мы делаем сдвиг влево для целого числа, то результатом будет тоже целое число (объект класса "целое число"). Так и здесь — когда вы применяете оператор к своему объекту, оператор возвращает новый объект этого класса.

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

Как вернуть экземпляр класса в функции в Python

На этой неделе у меня был вызов класса, и хотя я вернул правильный возраст, я не вернул экземпляр класса в соответствии с инструкциями. Я прочитал этот пост , но синтаксис Python 2.7 кажется совершенно другим.

Класс реализован правильно, и вы правильно создаете его экземпляры. Но когда вы пытаетесь найти самую старую собаку, вы возвращаете только ее возраст, а не фактический экземпляр (согласно инструкциям). Экземпляр хранит информацию не только о возрасте, но и о имени. Небольшой комментарий: вы вызываете функцию «old_dog» из отформатированной строки — это нетрадиционно, вам лучше выполнить функцию в строке перед этим и включить только вычисленную переменную внутри отформатированной строки.

Как вернуть все объекты класса?

Нужно, чтобы класс мог вернуть все созданные объект этого класса. Можно статическим методом или обычным.

Допустим, есть класс:

Ответы (1 шт):

Один из способов — добавлять self в статический список класса, однако для сборщика мусора нужно не забыть использовать weakref:

У данного кода есть существенная проблема: этот список никогда не чистится автоматически, его нужно обновлять вручную, что является не самой тривиальной задачей.

Намного более медленный способ — пройтись по всем объектам сборщика мусора и найти объекты нужного типа:

Объектно-ориентированное программирование

Python имеет множество встроенных типов, например, int, str и так далее, которые мы можем использовать в программе. Но также Python позволяет определять собственные типы с помощью классов . Класс представляет некоторую сущность. Конкретным воплощением класса является объект.

Можно еще провести следующую аналогию. У нас у всех есть некоторое представление о человеке, у которого есть имя, возраст, какие-то другие характеристики Человек может выполнять некоторые действия — ходить, бегать, думать и т.д. То есть это представление, которое включает набор характеристик и действий, можно назвать классом. Конкретное воплощение этого шаблона может отличаться, например, одни люди имеют одно имя, другие — другое имя. И реально существующий человек будет представлять объект этого класса.

Класс определяется с помощью ключевого слова class :

Внутри класса определяются его атрибуты, которые хранят различные характеристики класса, и методы — функции класса.

https://amdy.su/wp-admin/options-general.php?page=ad-inserter.php#tab-8

Создадим простейший класс:

В данном случае определен класс Person, который условно представляет человека. В данном случае в классе не определяется никаких методов или атрибутов. Однако поскольку в нем должно быть что-то определено, то в качестве заменителя функционала класса применяется оператор pass . Этот оператор применяется, когда синтаксически необходимо определить некоторый код, однако мы не хотим его, и вместо конкретного кода вставляем оператор pass.

После создания класса можно определить объекты этого класса. Например:

После определения класса Person создаются два объекта класса Person — tom и bob. Для создания объекта применяется специальная функция — конструктор , которая называется по имени класса и которая возвращает объект класса. То есть в данном случае вызов Person() представляет вызов конструктора. Каждый класс по умолчанию имеет конструктор без параметров:

Методы классов

Методы класса фактически представляют функции, которые определенны внутри класса и которые определяют его поведение. Например, определим класс Person с одним методом:

Здесь определен метод say_hello() , который условно выполняет приветствие — выводит строку на консоль. При определении методов любого класса следует учитывать, что все они должны принимать в качестве первого параметра ссылку на текущий объект, который согласно условностям называется self . Через эту ссылку внутри класса мы можем обратиться к функциональности текущего объекта. Но при самом вызове метода этот параметр не учитывается.

Используя имя объекта, мы можем обратиться к его методам. Для обращения к методам применяется нотация точки — после имени объекта ставится точка и после нее идет вызов метода:

Например, обращение к методу say_hello() для вывода приветствия на консоль:

В итоге данная программа выведет на консоль строку «Hello».

Если метод должен принимать другие параметры, то они определяются после параметра self , и при вызове подобного метода для них необходимо передать значения:

Здесь определен метод say() . Он принимает два параметра: self и message. И для второго параметра — message при вызове метода необходимо передать значение.

Через ключевое слово self можно обращаться внутри класса к функциональности текущего объекта:

Например, определим два метода в классе Person:

Здесь в одном методе — say_hello() вызывается другой метод — say() :

Поскольку метод say() принимает кроме self еще параметры (параметр message), то при вызове метода для этого параметра передается значение.

Причем при вызове метода объекта нам обязательно необходимо использовать слово self , если мы его не используем:

То мы столкнемся с ошибкой

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

Для создания объекта класса используется конструктор. Так, выше когда мы создавали объекты класса Person, мы использовали конструктор по умолчанию, который не принимает параметров и который неявно имеют все классы:

Однако мы можем явным образом определить в классах конструктор с помощью специального метода, который называется __init__() (по два прочерка с каждой стороны). К примеру, изменим класс Person, добавив в него конструктор:

Итак, здесь в коде класса Person определен конструктор и метод say_hello() . В качестве первого параметра конструктор, как и методы, также принимает ссылку на текущий объект — self. Обычно конструкторы применяются для определения действий, которые должны производиться при создании объекта.

Теперь при создании объекта:

будет производится вызов конструктора __init__() из класса Person, который выведет на консоль строку «Создание объекта Person».

Атрибуты объекта

Атрибуты хранят состояние объекта. Для определения и установки атрибутов внутри класса можно применять слово self . Например, определим следующий класс Person:

Теперь конструктор класса Person принимает еще один параметр — name. Через этот параметр в конструктор будет передаваться имя создаваемого человека.

Внутри конструктора устанавливаются два атрибута — name и age (условно имя и возраст человека):

Атрибуту self.name присваивается значение переменной name. Атрибут age получает значение 1.

Если мы определили в классе конструктор __init__, мы уже не сможем вызвать конструктор по умолчанию. Теперь нам надо вызывать наш явным образом опреледеленный конструктор __init__, в который необходимо передать значение для параметра name:

Далее по имени объекта мы можем обращаться к атрибутам объекта — получать и изменять их значения:

В принципе нам необязательно определять атрибуты внутри класса — Python позволяет сделать это динамически вне кода:

Здесь динамически устанавливается атрибут company, который хранит место работы человека. И после установки мы также можем получить его значение. В то же время подобное определение чревато ошибками. Например, если мы попытаемся обратиться к атрибуту до его определения, то программа сгенерирует ошибку:

Для обращения к атрибутам объекта внутри класса в его методах также применяется слово self:

Здесь определяется метод display_info(), который выводит информацию на консоль. И для обращения в методе к атрибутам объекта применяется слово self: self.name и self.age

Создание объектов

Выше создавался один объект. Но подобным образом можно создавать и другие объекты класса:

Здесь создаются два объекта класса Person: tom и bob. Они соответствуют определению класса Person, имеют одинаковый набор атрибутов и методов, однако их состояние будет отличаться.

При выполнении программы Python динамически будет определять self — он представляет объект, у которого вызывается метод. Например, в строке:

Добавить комментарий

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