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

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

Класс object() в Python, возвращает безликий объект.

Встроенный класс object() возвращает новый безликий объект. Класс object() является базой для всех классов. В нем есть методы, общие для всех экземпляров классов Python.

Этот класс не принимает никаких аргументов.

Когда мы объявляем класс:

то по сути MyClass наследуется от класса object .

Kласс object — это экземпляр типа type :

Обратите внимание, что объект не имеет словаря __dict__ , поэтому нельзя назначить произвольные атрибуты экземпляру класса object() .

Примеры использования object .

В следующем примере будем использовать экземпляры класса object в качестве значений для перечислений Color .

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

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

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

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

Формы 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

Я пытаюсь создать класс, который возвращает значение, а не самостоятельно.

я покажу вам пример сравнения со списком:

мне нужно, чтобы MyClass возвращал список, например list() делает, а не информация об экземпляре. Я знаю, что могу составить подкласс списка. Но есть ли способ сделать это без подклассов?

Я хочу имитировать список (или другие объекты):

почему m1 == m2 ложь? Это вопрос.

извините если я не отвечу всем вам. Я пробую все решения, которые ты мне даешь. Я не могу использовать def , потому что мне нужно использовать такие функции, как setitem, getitem и т. д.

5 ответов

если то, что вы хотите, это способ превратить ваш класс В своего рода список без подклассов list , затем просто сделайте метод, который возвращает список:

если вы это имели в виду print MyClass() напечатает список, просто переопределите __repr__ :

изменить: Я вижу, вы имели в виду, как делать объекты сравнить. Для этого вы переопределяете __cmp__ метод.

я думаю, что вы очень смущены тем, что происходит.

в Python все является объектом:

  • [] (список) является объектом
  • ‘abcde’ (строка) является объектом
  • 1 (целое число) является объектом
  • MyClass() (экземпляр) является объектом
  • MyClass (класс) также является объектом
  • list (типа как класс) тоже объект

когда вы вызываете объект класса (например, MyClass() или list() ), он возвращает экземпляр этого класса. ( list действительно тип, а не класс, но я немного упрощаю здесь.)

когда вы печати объект (т. е. получить строковое представление объекта), этот объект __str__ или __repr__ магический метод вызывается и возвращаемое значение печати.

Итак, то, что вы просите: «мне нужно, чтобы MyClass вернул список, например list (), а не информацию об экземпляре», не имеет никакого смысла. list() возвращает экземпляр списка. MyClass() возвращает экземпляр MyClass. Если вам нужен экземпляр списка, просто получите экземпляр списка. Если вместо вопроса как выглядят эти объекты, когда вы print их или посмотреть на них в консоли, затем создать __str__ и __repr__ метод, который представляет их как вы хотите, чтобы они были представлены.

обновление для нового вопроса о равенстве

еще раз __str__ и __repr__ только для печати, и не влияют на объект каким-либо другим образом. Просто потому, что два объекта имеют одно и то же __repr__ значение не означает, что они равны!

MyClass() != MyClass() потому что ваш класс не определяет, как они будут равны, поэтому он возвращается к поведению по умолчанию ( object type), то есть объекты равны только самим себе:

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

например, вы можете иметь объект, который равен всем:

я думаю, что вы должны сделать две вещи:

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

теперь это будет действовать как список, не будучи списком (т. е. без подклассов list ).

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

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