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

Класс и объект в Python

Python — это процедурно-ориентированный и одновременно объектно-ориентированный язык программирования.

Процедурно-ориентированный

«Процедурно-ориентированный» подразумевает наличие функций. Программист может создавать функции, которые затем используются в сторонних скриптах.

Объектно-ориентированный

«Объектно-ориентированный» подразумевает наличие классов. Есть возможность создавать классы, представляющие собой прототипы для будущих объектов.

Создание класса в Python

Синтаксис для написания нового класса:

  • Для создания класса пишется ключевое слово class , его имя и двоеточие (:). Первая строчка в теле класса описывает его. (По желанию) получить доступ к этой строке можно с помощью ClassName.__doc__
  • В теле класса допускается объявление атрибутов, методов и конструктора.

Атрибут:

Атрибут — это элемент класса. Например, у прямоугольника таких 2: ширина ( width ) и высота ( height ).

Метод:

  • Метод класса напоминает классическую функцию, но на самом деле — это функция класса. Для использования ее необходимо вызывать через объект.
  • Первый параметр метода всегда self (ключевое слово, которое ссылается на сам класс).

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

  • Конструктор — уникальный метод класса, который называется __init__ .
  • Первый параметр конструктора во всех случаях self (ключевое слово, которое ссылается на сам класс).
  • Конструктор нужен для создания объекта.
  • Конструктор передает значения аргументов свойствам создаваемого объекта.
  • В одном классе всегда только один конструктор.
  • Если класс определяется не конструктором, Python предположит, что он наследует конструктор родительского класса.

Создание объекта с помощью класса Rectangle:

Создание объекта с помощью класса Rectangle

Расчет площади класса Rectangle

Что происходит при создании объекта с помощью класса?

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

Конструктор выбранного класса

Конструктор с аргументами по умолчанию

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

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

Конструктор с аргументами по умолчанию

Сравнение объектов

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

Если объект AA — это просто ссылка на объект BB , то он не будет сущностью, занимающей отдельную ячейку памяти. Вместо этого он лишь ссылается на местоположение BB .

Как происходит сравнение объектов

Оператор == нужен, чтобы узнать, ссылаются ли два объекта на одно и то же место в памяти. Он вернет True , если это так. Оператор != вернет True , если сравнить 2 объекта, которые ссылаются на разные места в памяти.

Сравнение объектов

Атрибуты

В Python есть два похожих понятия, которые на самом деле отличаются:

  1. Атрибуты
  2. Переменные класса

Стоит разобрать на практике:

Атрибут

Объекты, созданные одним и тем же классом, будут занимать разные места в памяти, а их атрибуты с «одинаковыми именами» — ссылаться на разные адреса. Например:

Объекты одного класса занимают разные места в памяти

Изменение значений атрибутов

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

Встроенные атрибуты класса

Объекты класса — дочерние элементы по отношению к атрибутам самого языка Python. Таким образом они заимствуют некоторые атрибуты:

Атрибут Описание
__dict__ Предоставляет данные о классе коротко и доступно, в виде словаря
__doc__ Возвращает строку с описанием класса, или None , если значение не определено
__class__ Возвращает объект, содержащий информацию о классе с массой полезных атрибутов, включая атрибут __name__
__module__ Возвращает имя «модуля» класса или __main__ , если класс определен в выполняемом модуле.

Переменные класса

Переменные класса в Python — это то же самое, что Field в других языках, таких как Java или С#. Получить к ним доступ можно только с помощью имени класса или объекта.

Для получения доступа к переменной класса лучше все-таки использовать имя класса, а не объект. Это поможет не путать «переменную класса» и атрибуты.

Переменные класса

У каждой переменной класса есть свой адрес в памяти. И он доступен всем объектам класса.

Составляющие класса или объекта

В Python присутствует функция dir , которая выводит список всех методов, атрибутов и переменных класса или объекта.

Как вернуть объекты сразу после создания экземпляров классов в Python?

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

Python — это не Java; не каждая функция должна быть методом какого-то класса.

Какова цель Builder , если все, что он делает, — это отдавать version в MyObject ? Есть ли в Builder другие атрибуты, относящиеся к MyObject , в реальном сценарии?

3 метода стилизации элементов HTML

Формы c голосовым вводом в React с помощью Speechly

Flatpickr: простой модуль календаря для вашего приложения на React

Что такое cURL в PHP? Встроенные функции и пример GET запроса

Ответы 2

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

Возвращаясь к тому, что вы спросили, об использовании класса Builder без вызова build() : хотя конструктор класса построителя может возвращать MyObject , переопределяя __new__ , я действительно не рекомендую это.

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

Строитель как функция

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

Строительный заводской метод

Или, если класс Builder действительно подходит для того, чтобы быть классом, и вы просто не показали нам, почему, вы можете добавить фабричный метод в конструктор:

Функция с использованием Builder

Если вы не хотите изменять класс построителя, но хотите один вызов:

Есть запутанные способы добиться этого, но ценность этого весьма сомнительная.

В моем конкретном случае построитель создает запись в БД, и я хотел бы вернуть ее объектное представление. Это невозможно только через создание экземпляра.

Значит, строитель выполняет работу, которую вы не показали выше, и вы хотите оставить строителя?

Если Builder — это отдельный объект, который создает запись в БД и, возможно, хранит некоторую другую информацию, как можно разумно ожидать, что Builder(‘0.0.1’) вернет оба фактический объект Builder , а также MyObject ? И если Builder служит только для выполнения некоторых операций, но не сохраняет никаких атрибутов, почему бы просто не использовать его в качестве function , возвращающего готовый объект, вместо class ?

@Idlehands «как» — сложный вопрос, поскольку полное переопределение __new__ мог делает именно это. Однако, как справедливо отмечает Хуанпа, его ценность . сомнительна.

@AdamSmith — хороший аргумент, хотя в свое оправдание я сказал: «Как вы можете ожидать разумно» 🙂

Python: исходный класс «объект» переопределен. Как вернуть класс объекта?

Я использую язык python для Squish Automation Tool. Этот инструмент расширяет python некоторыми пользовательскими объектами и функциями. Об этом говорят в руководство:

Модули расширения Squish, специфичные для Python, загружаются автоматически путем внутреннего выполнения эквивалента следующих операторов:

Это означает, что нет необходимости импортировать их самостоятельно, если только вы не разрабатываете свой собственный автономный модуль.

Тем самым они переопределяют object автоматически (в это), поэтому мои попытки сделать классы нового стиля (например, class NewClass(object): ) выдает мне ошибку:

TypeError: Ошибка при вызове баз метаклассов. module.__init__() принимает не более 2 аргументов (даны 3)

Итак, я пытаюсь получить object назад. После прочтения удивительная статья о метаклассах Я пытаюсь получить object со следующим кодом:

Мой вопрос: это то же самое, что и наследование от оригинала object учебный класс?

ОБНОВИТЬ: я ограничен в использовании Python 2.4 (если это важно)

2 ответы

С той самой страницы, на которую вы ссылаетесь:

Объектный модуль Squish имеет то же имя, что и базовый класс всех классов нового стиля Python 2 и всех классов Python 3. На практике это очень редко является проблемой. Для Python 2 мы можем просто создать классы в старом стиле или сделать import __builtin__ и унаследовать от __builtin__.object вместо объекта. Для Python 3 ничего делать не нужно, поскольку мы никогда не наследуем объект явно, поскольку он наследуется по умолчанию, если не указан другой класс.

Хотя, замечу, что я считаю это крайне неудачным решением со стороны создателей указанного модуля, они должны были назвать его как-то по-другому. Даже если он предназначен для Python 3.x, если они распространяют его для 2.x, они должны были на мгновение подумать, что им не повредит назвать его как-то по-другому, и, назвав его object они создают проблемы.

ответ дан 23 апр.

Полностью согласен. Такой дизайн губителен! — Заур Насибов

Насчет дизайна тоже полностью согласен. Они также переопределили type с функцией, поэтому class NewClass(type): так же нельзя. В любом случае, спасибо, что нашли время, чтобы посмотреть руководство и указать на то, что я пропустил. — Алексей Окрушко

Возврат экземпляра класса из функции

Я создаю функцию, внутри которой создается экземпляр класса Inst. Как правильно вернуть этот экземпляр и все его атрибуты, чтобы им можно было пользоваться в дальнейшем?

return Inst — возвращает, как это правильно назвать, ссылку на экземпляр? <__main__.Class1 at 0x20abc9d0f10>

С ходу гугл не помог.

Понимаю, что такие вещи надо в книжках искать, но если кто-нибудь поможет — очень буду благодарен.

Почему при вызове метода у экземпляра класса он сначала ищет у экземпляра
Всем привет, после прочтения Лутца про ООП появился такой вопрос почему при вызове метода у.

Возврат имени экземпляра класса
Есть класс CLASS1, у него 2 экземпляра- ex1 и ex2. Нужно что бы при вызове метода в одном из.

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

Удаление экземпляра класса в функции самого класса (Ошибка при отладке)
Допустим, у нас есть класс Buffer, который хранит в себе указатель на класс некоторой матрицы и.

Сообщение от TAVulator

TAVulator, Да, именно так я и попытался это реализовать, но видимо загвоздка не в этом.

Попробую чуть более детально описать ситуацию:

В теле основной программы есть функция:

Соответственно создается экземпляр fiber1 и вызываются 2 метода, которые рассчитывают некоторые атрибуты. Класс FiberFunction загружается из модуля.

Далее внутри этой же функции рисуем графики атрибутов экземпляра. Они отображаются корректно.

Обращается к атрибуту экземпляра, который был инициализирован при вызове первой функции. Но она это обращение "не видит".

И да, это все происходит внутри PyQt5 интерфейса, функции вызываются через нажатия кнопок. Я изначально подумал, что проблема именно в базовом подходе.

Если эта проблема возникает именно при работе внутри pyqt5 интерфейса, то прошу прощения и попрошу перенести тему.

Спасибо за уделенное время!

Сообщение от 9FiZiK

Сообщение от 9FiZiK
Сообщение от Garry Galler

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

Сообщение от Garry Galler

Вы имеете ввиду непосредственно функции нажатий кнопок?

Сообщение от Garry Galler

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

Сделал следующим образом:

Оставил в возврате только один из атрибутов, присвоив его предварительно в "x".

Вторую функцию переписал как:

Если в теле я нигде не объявляю переменную "x", то мне пишет "Undefined name x"
либо если я опишу "x" как например x = 0, или global x — не важно

TypeError: argument 1 has unexpected type ‘NoneType’

Добавлено через 40 минут

В предыдущем ответе немного неправильно написал

Если в теле я нигде не объявляю переменную "x", то мне пишет "Undefined name x"
либо если я опишу "x" как например x = 0, или global x — не важно

TypeError: argument 1 has unexpected type ‘NoneType’

Сообщение от 9FiZiK

В clicked.connect передается не вызов функции, а сама функция.

P.S. У тебя проблема с созданием правильной структуры приложения. Неявные возвраты, обращение к global и т.д. до добра не доводят.

Добавлено через 38 минут
P.P.S. Если хочешь привязать x к функции без ее вызова используй functools.partial.

Сообщение от Garry Galler

Да, я это понимаю. Даже уже некоторые шаги сделал: завернул модуль в ООП. Но в данной проблеме не могу понять правильного подхода. Мои нативные представления говорят мне: напиши return x и пользуйся им, но не работает)

Не могли бы вы подсказать как будет правильно организовать основную программу? Либо где конкретно об этом можно почитать/посмотреть.

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

Сообщение от 9FiZiK

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

Сообщение от 9FiZiK

Просто погугли, например, pyqt examples, что увидеть как люди пишут интерфейсы.
https://github.com/pyqt/examples

А по ООП нужно читать много толстых книжек.

Как создать атрибут экземпляра класса в методе экземпляра класса?
Здравствуйте. Подскажите, как в javascript создать новый атрибут экземпляра класса в методе.

Создание экземпляра класса, разрушение экземпляра класса
Не могу найти информацию про разрущение экземпляра класса. Объясните пожалуйста, что это?

При создании экземпляра класса, создается 2 экземпляра вместо 1
Подсчет экземпляров ведется с помощью статического члена num_dogs, который во всех трех.

Создание нового экземпляра дочернего класса из экземпляра базового
Всем привет! Извиняюсь, если вопрос глупый, но что-то не смог найти конкретный ответ на него. .

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

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

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