Возвращение класса Python
Зачем нам нужно писать return CLASS_NAME? Когда и зачем нужно возвращать класс?
Возвращать класс нужно в вызывающую функцию,чтобы она воспользовалась методами этого обьекта,ведь возвращается обьект класса,ну а этот обьект по какой то причине был создан в вызываемой функции,например если вы list создаете внутри функции вы можете передать ссылку на него.
Ну вот вам искусственный пример, в котором возвращается и используется класс:
В переменной c получается случайным образом либо класс A , либо класс B , и мы вызываем функцию этого класса, не зная, какой у нас класс, нам всё-равно, у них у обоих есть эта функция.
В вашем же примере возвращается экземпляр класса , это практически тоже самое, что в моём примере, но у вас получается как бы настроенный класс. Т.е. класс то вы возвращаете один и тот же, но поведение у него может быть разное в зависимости от инициализации класса. Опять же пример:
У вас в примере нет возврата класса: Note(. ) — это создание нового объекта вашего класса.
Зачем тут создается этот объект:
В результате применения оператора (оператора сдвига в данном случае) обычно получается объект (новый или уже существующий) того же класса, что и изначальный объект: по аналогии, если мы делаем сдвиг влево для целого числа, то результатом будет тоже целое число (объект класса "целое число"). Так и здесь — когда вы применяете оператор к своему объекту, оператор возвращает новый объект этого класса.
В целом, результатом выполнения оператора может быть и объект другого класса (например, при делении целого числа на целое может получиться число с плавающей точкой). Но в данном случае логично возвращать именно объект того же класса.
Как вернуть экземпляр класса в функции в Python
На этой неделе у меня был вызов класса, и хотя я вернул правильный возраст, я не вернул экземпляр класса в соответствии с инструкциями. Я прочитал этот пост , но синтаксис Python 2.7 кажется совершенно другим.
Класс реализован правильно, и вы правильно создаете его экземпляры. Но когда вы пытаетесь найти самую старую собаку, вы возвращаете только ее возраст, а не фактический экземпляр (согласно инструкциям). Экземпляр хранит информацию не только о возрасте, но и о имени. Небольшой комментарий: вы вызываете функцию «old_dog» из отформатированной строки — это нетрадиционно, вам лучше выполнить функцию в строке перед этим и включить только вычисленную переменную внутри отформатированной строки.
Как вернуть все объекты класса?
Нужно, чтобы класс мог вернуть все созданные объект этого класса. Можно статическим методом или обычным.
Допустим, есть класс:
Ответы (1 шт):
Один из способов — добавлять self в статический список класса, однако для сборщика мусора нужно не забыть использовать weakref:
У данного кода есть существенная проблема: этот список никогда не чистится автоматически, его нужно обновлять вручную, что является не самой тривиальной задачей.
Намного более медленный способ — пройтись по всем объектам сборщика мусора и найти объекты нужного типа:
Объектно-ориентированное программирование
Python имеет множество встроенных типов, например, int, str и так далее, которые мы можем использовать в программе. Но также Python позволяет определять собственные типы с помощью классов . Класс представляет некоторую сущность. Конкретным воплощением класса является объект.
Можно еще провести следующую аналогию. У нас у всех есть некоторое представление о человеке, у которого есть имя, возраст, какие-то другие характеристики Человек может выполнять некоторые действия — ходить, бегать, думать и т.д. То есть это представление, которое включает набор характеристик и действий, можно назвать классом. Конкретное воплощение этого шаблона может отличаться, например, одни люди имеют одно имя, другие — другое имя. И реально существующий человек будет представлять объект этого класса.
Класс определяется с помощью ключевого слова class :
Внутри класса определяются его атрибуты, которые хранят различные характеристики класса, и методы — функции класса.
Создадим простейший класс:
В данном случае определен класс 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 — он представляет объект, у которого вызывается метод. Например, в строке: