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

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

  • автор:

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

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

class A (): def __init__(self): pass def GetAllObject(self): #Код, который вернет все объекты return list_object 

Отслеживать
user302909
задан 14 янв 2020 в 18:45
13 2 2 бронзовых знака

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

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

import weakref class A: instance_list = list() def __init__(self): self.__class__.instance_list.append(weakref.proxy(self)) def GetAllObjects(self): return A.instance_list obj1 = A() obj2 = A() print(A.instance_list) # [, ] print(obj1.GetAllObjects()) # [, ] 

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

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

import gc def GetObjectsOfType(type): objects_list = list() for obj in gc.get_objects(): if isinstance(obj, type): objects_list.append(obj) return objects_list class A: def __init__(self): pass obj1 = A() obj2 = A() print(GetObjectsOfType(A)) 

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

Author24 — интернет-сервис помощи студентам

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

return Inst — возвращает, как это правильно назвать, ссылку на экземпляр?

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

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

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

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

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

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

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

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

Эксперт по компьютерным сетямЭксперт Pascal/Delphi

4190 / 1291 / 237
Регистрация: 27.07.2009
Сообщений: 3,962

1 2 3 4 5 6 7 8 9 10 11 12 13
class Class1(object): def __init__(self, text): self.var1 = text def func(): g = Class1('text') # создали экземпляр класса g.var1 = 'sometext' # изменили переменную в экземпляре класса return g # вернули экземпляр класса j = Class1('other text') # создали новый экземпляр вне ф-ции h = func() # вызвали ф-цию и результат ее работы (экземпляр класса) присвоили в h print(j.var1) # смотрим что в экземпляре вне ф-ции print(h.var1) # смотрим что в экземпляре от ф-ции

Регистрация: 06.10.2020
Сообщений: 13

ЦитатаСообщение от TAVulator Посмотреть сообщение

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

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

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

1 2 3 4 5 6 7 8 9 10
def FiberReturn(): fiber1 = FiberFunction(100, 0.1, 0.0001, 1550*10**-(9), 1551*10**(-9), 1, 0.0001) fiber1.LightPropagation() fiber1.Fourier() ui.graphicsView_2.clear() ui.graphicsView_3.clear() ui.graphicsView_2.plot(np.real(fiber1.ffn)) ui.graphicsView_3.plot(np.real(fiber1.fftstr)) return fiber1

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

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

1 2 3
def OpenWindow(): SignalWindow.show() uis.graphicsView.plot(np.real(fiber1.ffn),pen=2)

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

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

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

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

Эксперт Python

5417 / 3841 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1

ЦитатаСообщение от 9FiZiK Посмотреть сообщение

uis.graphicsView.plot(np.real(fiber1.ffn),pen=2)

Откуда эта функция берет экземпляр fiber1? Ты же нигде его прокидываешь сюда.
Из глобальной области что ли? Почему PyQT не завернуто в ООП?
Что делает .show()? Отрисовывает окно? Ее же всегда пишут последним вызовом.

Эксперт по компьютерным сетямЭксперт Pascal/Delphi

4190 / 1291 / 237
Регистрация: 27.07.2009
Сообщений: 3,962

как происходит вызов FiberReturn() ?
куда сохраняется результат этой ф-ции?
Вот как найдете в какую переменную охраняется результат ф-ции FiberReturn(), то смело подставляйте ее вместо fiber1 в

ЦитатаСообщение от 9FiZiK Посмотреть сообщение

uis.graphicsView.plot(np.real(fiber1.ffn),pen=2)
Регистрация: 06.10.2020
Сообщений: 13

ЦитатаСообщение от Garry Galler Посмотреть сообщение

Из глобальной области что ли?

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

ЦитатаСообщение от Garry Galler Посмотреть сообщение

Почему PyQT не завернуто в ООП?

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

ЦитатаСообщение от Garry Galler Посмотреть сообщение

Что делает .show()? Отрисовывает окно? Ее же всегда пишут последним вызовом.

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

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

1 2 3 4 5 6 7 8 9 10 11
def FiberReturn(): fiber1 = FiberFunction(1000, 0.1, 0.0001, 1550*10**-(9), 1551*10**(-9), 1, 0.0001) fiber1.LightPropagation() fiber1.Fourier() print(fiber1.fftstr[5], fiber1.fftnstr[5]) ui.graphicsView_2.clear() ui.graphicsView_3.clear() ui.graphicsView_2.plot(np.real(fiber1.ffn)) ui.graphicsView_3.plot(np.real(fiber1.fftstr))

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

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

1 2 3
def OpenWindow(x1): uis.graphicsView.plot(np.real(x1),pen=2) SignalWindow.show()
ui.pushButton_6.clicked.connect(GUIFunc.FiberReturn) #вызов первой функции
ui.pushButton_2.clicked.connect(GUIFunc.OpenWindow(x)) # Вызов второй функции

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

TypeError: argument 1 has unexpected type ‘NoneType’

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

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

ui.pushButton_6.clicked.connect(FiberReturn) #вызов первой функции
ui.pushButton_2.clicked.connect(OpenWindow(x)) # Вызов второй функции

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

TypeError: argument 1 has unexpected type ‘NoneType’

Эксперт Python

5417 / 3841 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1

ЦитатаСообщение от 9FiZiK Посмотреть сообщение

ui.pushButton_2.clicked.connect(OpenWindow(x))

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

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

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

Регистрация: 06.10.2020
Сообщений: 13

ЦитатаСообщение от Garry Galler Посмотреть сообщение

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

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

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

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

Эксперт Python

5417 / 3841 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1

ЦитатаСообщение от 9FiZiK Посмотреть сообщение

но не работает)

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

ЦитатаСообщение от 9FiZiK Посмотреть сообщение

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

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

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

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

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

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

Создание экземпляра класса — наследника экземпляра другого класса
Имеется два класса: класс Layer и класс-наследник Neuron. Я создал экземпляр класса Layer l1 и.

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

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

Или воспользуйтесь поиском по форуму:

Как вернуть значения класса из функции python?

def filePerson():
a = str(input(‘Введите статус, имя, фамилию, и дату рождения(__.__.____) через пробел: ‘))
b = a.split()
status = b[0]
name = b[1]
surname = b[2]
birthday = b[3]
per1 = personOfFamily(status, name, surname, birthday)
print(per1.name, per1.surname, ‘зарегистрирован.’)
return per1

  • Вопрос задан более года назад
  • 228 просмотров

1 комментарий

Простой 1 комментарий

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

Начиная с 3-й версии в языке программирования Python все классы неявно имеют один общий суперкласс — object и все классы по умолчанию наследуют его методы.

Одним из наиболее используемых методов класса object является метод __str__() . Когда необходимо получить строковое представление объекта или вывести объект в виде строки, то Python как раз вызывает этот метод. И при определении класса хорошей практикой считается переопределение этого метода.

К примеру, возьмем класс Person и выведем его строковое представление:

class Person: def __init__(self, name, age): self.name = name # устанавливаем имя self.age = age # устанавливаем возраст def display_info(self): print(f"Name: Age: ") tom = Person("Tom", 23) print(tom)

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

Это не очень информативная информация об объекте. Мы, конечно, можем выйти из положения, определив в классе Person дополнительный метод, который выводит данные объекта — в примере выше это метод display_info.

Но есть и другой выход — определим в классе Person метод __str__() (по два подчеркивания с каждой стороны):

class Person: def __init__(self, name, age): self.name = name # устанавливаем имя self.age = age # устанавливаем возраст def display_info(self): print(self) # print(self.__str__()) # или так def __str__(self): return f"Name: Age: " tom = Person("Tom", 23) print(tom) # Name: Tom Age: 23 tom.display_info() # Name: Tom Age: 23

Метод __str__ должен возвращать строку. И в данном случае мы возвращаем базовую информацию о человеке. Если нам потребуется использовать эту информацию в других методах класса, то мы можем использовать выражение self.__str__()

И теперь консольный вывод будет другим:

Name: Tom Age: 23 Name: Tom Age: 23

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

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