Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/55: Рейтинг темы: голосов - 55, средняя оценка - 4.80
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705

Как узнать, сколько раз создан объект?

30.06.2020, 00:20. Показов 11103. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Друзья! Код не мой. В программе создаётся объект такого класса, хочется знать, сколько раз он создан?

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class ListExtensions(rq.ReplyRequest):
    _request = rq.Struct(
        rq.Opcode(99),
        rq.Pad(1),
        rq.RequestLength(),
        )
 
    _reply = rq.Struct(
        rq.ReplyCode(),
        rq.LengthOf('names', 1),
        rq.Card16('sequence_number'),
        rq.ReplyLength(),
        rq.Pad(24),
        rq.List('names', rq.Str),
        )
Кабы бы конструктор, я бы в него что-нибудь дописал и считал не торопясь. А тут конструктора нет. Вот сижу, ломаю голову. Спасибо, кто откликнется.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.06.2020, 00:20
Ответы с готовыми решениями:

Как узнать создан объект-форма(в Дэлфи) или нет?
Использую MDI форму, при этом Application.CreateForm(...) пишу не в файле проэкта, а тогда когда нужно 'показать' форму. Поэтому другой...

Как узнать сколько байтов в памяти занимает объект?
Есть ли в Java аналог sizeOf?

Как узнать сколько раз использувалась функция?
Здравствуйте, я написал функцию суммы: float suma(float a, float b) { float sum; sum = a+b; return sum; }

15
291 / 193 / 104
Регистрация: 14.11.2017
Сообщений: 489
30.06.2020, 00:50
Python
1
2
3
4
5
6
7
8
9
10
class ExampleInstance:
    instances_count = 0
 
    def __init__(self):
        ExampleInstance.instances_count += 1
 
 
for _ in range(5):
    _ = ExampleInstance()
print("Количество экземпляров:", ExampleInstance.instances_count)
Добавлено через 19 секунд
Вывод:
Code
1
Количество экземпляров: 5
Добавлено через 55 секунд
Думаю пример понятен
1
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
30.06.2020, 01:06  [ТС]
Цитата Сообщение от zhurban Посмотреть сообщение
Думаю пример понятен
нет. Я прежде, чем спрашивать, всяко пробую:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class ListExtensions(rq.ReplyRequest):
    instances_count = 0
    def __init__(self):
        ExampleInstance.instances_count += 1
 
    _request = rq.Struct(
        rq.Opcode(99),
        rq.Pad(1),
        rq.RequestLength(),
        )
 
    _reply = rq.Struct(
        rq.ReplyCode(),
        rq.LengthOf('names', 1),
        rq.Card16('sequence_number'),
        rq.ReplyLength(),
        rq.Pad(24),
        rq.List('names', rq.Str),
        )
Windows Batch file
1
TypeError: __init__() takes exactly 1 argument (2 given)
0
291 / 193 / 104
Регистрация: 14.11.2017
Сообщений: 489
30.06.2020, 01:10
Цитата Сообщение от kravam Посмотреть сообщение
ExampleInstance
Ну во-первых тут нужно указывать название вашего класса
Во-вторых
Цитата Сообщение от kravam Посмотреть сообщение
TypeError: __init__() takes exactly 1 argument (2 given)
Вы передаете два аргумента в конструктор
Покажите как вы создаете объекты

Добавлено через 32 секунды
Python
1
2
def __init__(self):
        ListExtensions.instances_count += 1
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
30.06.2020, 01:28  [ТС]
Цитата Сообщение от zhurban Посмотреть сообщение
Ну во-первых тут нужно указывать название вашего класса
а да, прошу прощения, но ошибка та же

Цитата Сообщение от zhurban Посмотреть сообщение
Покажите как вы создаете объекты
вот так:
Python
1
request.ListExtensions(self.display)
(вся эта бальда пописана в файле request.py)

Если это не добавлять:
Python
1
2
3
    instances_count = 0
    def __init__(self):
        ListExtensions.instances_count += 1
, то ошибки нет.
0
291 / 193 / 104
Регистрация: 14.11.2017
Сообщений: 489
30.06.2020, 01:47
kravam, предпологаю что нужно заменить конструктор на такой:
Python
1
2
3
def __init__(self, display):
    super().__init__(display)
    ListExtensions.instances_count += 1
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
30.06.2020, 01:52  [ТС]
Цитата Сообщение от zhurban Посмотреть сообщение
kravam, предпологаю что нужно заменить конструктор на такой:
Python
1
2
3
def __init__(self, display):
    super().__init__(display)
    ListExtensions.instances_count += 1
, увы
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class ListExtensions(rq.ReplyRequest):
    def __init__(self, display):
        super().__init__(display)
        ListExtensions.instances_count += 1
 
    _request = rq.Struct(
        rq.Opcode(99),
        rq.Pad(1),
        rq.RequestLength(),
        )
 
    _reply = rq.Struct(
        rq.ReplyCode(),
        rq.LengthOf('names', 1),
        rq.Card16('sequence_number'),
        rq.ReplyLength(),
        rq.Pad(24),
        rq.List('names', rq.Str),
        )
Windows Batch file
1
2
    super().__init__(display)
TypeError: super() takes at least 1 argument (0 given)
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
30.06.2020, 01:58
Цитата Сообщение от kravam Посмотреть сообщение
Кабы бы конструктор, я бы в него что-нибудь дописал и считал не торопясь.
А кто Вам мешает добавить конструктор? У Лутца описывается пример, как считать количество созданных экземпляров класса. Для этого нужно создать счетчик, не как атрибут экземпляра класса, а как атрибут класса, не привязанный к какому либо конкретному экземпляру класса.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Spam:
    numInstances = 0   # Используется метод класса
    def __init__(self):
        Spam.numInstances += 1
    def printNumInstances(cls):
         print("Number of instances:", cls.numInstances)
    printNumInstances = classmethod(printNumInstances)
 
if __name__ == '__main__':
    a = Spam()
    a.printNumInstances()      # В первом аргументе передается класс
    b = Spam()
    b.printNumInstances()      # В первом аргументе передается класс
 
    # Или можно вызвать метод через класс, результат тот же.
 
    Spam.printNumInstances()   # Также в первом аргументе передается класс
Выводит:
Python
1
2
3
Number of instances: 1
Number of instances: 2
Number of instances: 2
Лутц М. Изучаем Python (4-е издание, 2011) стр. 894

Добавлено через 4 минуты
kravam, Используя данный пример, можете соответствующим образом доработать свой класс.
Или Вы не можете трогать тот класс?
1
291 / 193 / 104
Регистрация: 14.11.2017
Сообщений: 489
30.06.2020, 02:03
Лучший ответ Сообщение было отмечено kravam как решение

Решение

У вас же Python 2.7? Поробуйте вот так
Python
1
2
3
def __init__(self, display):
    super(ListExtensions, self).__init__(display)
    ListExtensions.instances_count += 1
1
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
30.06.2020, 02:08
Тогда, что бы что то Вам посоветовать нужен весь код. Что бы видеть окружение этого класса, каким образом он вызывается для создания экземпляров.

Добавлено через 3 минуты
kravam, Если у Вас питон не 3.Х то читайте Лутца, те страницы, которые я указал. Там есть варианты решения и для питона 2.Х.
1
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
30.06.2020, 02:13  [ТС]
Цитата Сообщение от zhurban Посмотреть сообщение
У вас же Python 2.7? Поробуйте вот так
Python
1
2
3
def __init__(self, display):
    super(ListExtensions, self).__init__(display)
    ListExtensions.instances_count += 1
так получилось, спасибо.
0
 Аватар для GulgDev
132 / 118 / 29
Регистрация: 09.07.2019
Сообщений: 1,071
30.06.2020, 20:33
zhurban, Viktorrus, kravam, а если к коду класса нет доступа? Надо делать с умом:
Python
1
2
3
4
5
6
7
import sys;
 
class MyClass():
    pass;
 
x = MyClass();
print(sys.getrefcount(MyClass) - 5);
Достаточно просто посчитать ссылки на объект.
Этот код выведет только кол-во экземпляров. Даже если приписать y = x, выведет 1:
Python
1
2
3
x = MyClass();
y = x;
print(sys.getrefcount(MyClass) - 5);


Добавлено через 2 минуты
Правда, a = MyClass; тоже будет считаться. Но если сделать парочку модификаций, то будет всё путём.
0
 Аватар для GulgDev
132 / 118 / 29
Регистрация: 09.07.2019
Сообщений: 1,071
01.07.2020, 13:01
Сейчас скину код получше.
0
 Аватар для GulgDev
132 / 118 / 29
Регистрация: 09.07.2019
Сообщений: 1,071
01.07.2020, 13:03
Вот та самая "парочка модификаций":
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import sys;
 
class MyClass():
    pass;
 
x = MyClass();
y = MyClass();
z = MyClass;
 
def get_all_variables():
    frames = list(sys._current_frames().values());
    variables = {};
    for frame in frames:
        variables.update(frame.f_locals);
        while(frame := frame.f_back):
            variables.update(frame.f_locals);
    return variables;
 
count = 0;
for name, value in get_all_variables().items():
    if isinstance(value, MyClass):
        count += 1;
        print(f'Instance of MyClass №{count} saved in the variable "{name}".');
if count == 0:
    print(f'Cannot find instances of MyClass.');
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
01.07.2020, 19:30
Hyppoprogramm, У меня такое ощущение, что Вы ссылками называете вызов класса. Кстати не забывайте, что это питон, и точка запятой в конце строки кода не нужна. А то выглядит как мешанина из нескольких языков.
Python
1
2
x = MyClass()
y = MyClass()
Вы видимо считаете, что здесь две ссылки на объект-класс. Но здесь на объект-класс одна ссылка. Она находится в переменной являющейся именем класса, то есть в переменной MyClass. И сколько бы раз не была использована эта переменная, что бы вызвать класс для создания экземпляра класса, количество ссылок на объект-класс будет равно одной. Количество ссылок, которые ссылаются на объект-класс может увеличится, если мы ссылку поместим еще и в другую переменную.
Python
1
z = MyClass
Вот теперь ссылок на объект-класс стало две. Вторая ссылка помещена в переменную z. И теперь мы через переменную z тоже можем вызывать объект-класс для создания экземпляра класса.
Python
1
b = z()
Вызывает объект-класс для создания еще одного экземпляра класса. Подозреваю, что количество вызовов z() для создания новых экземпляров класса Вы не учитываете. Но проверять это мне лень.
Посчитать количество созданных экземпляров таким способом, можно только если найти все переменные, которые хранят ссылки на этот объект-класс и посчитать общее количество вызовов с помощью каждой из этих переменных.
На самом же деле, питон это интерпретатор, и обычно мы всегда можем заменить кусок существующего кода, на свой код, что и делает kravam, с помощью zhurban.
Зачем нужны Ваши фантазии, мне честно говоря не понятно.
Однако я просто высказал свое мнение и в дискуссию с Вами вступать не намерен. Удачи.
0
 Аватар для GulgDev
132 / 118 / 29
Регистрация: 09.07.2019
Сообщений: 1,071
01.07.2020, 19:38
Viktorrus, мало ли что. Может пригодиться. Во всяком случае для пантов самое то!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.07.2020, 19:38
Помогаю со студенческими работами здесь

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

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

Как узнать сколько раз повторяется символ в строке
Как узнать сколько раз повторяется символ в строке. пример символ 3 строка 333486810лсовр ответ 3 раза

Как узнать, сколько раз заданная буква встречается в строке?
Нужно посчитать, сколько раз заданная заранее буква встречается в строке. string s = "Любая строка";

Как можно узнать, сколько раз была обновлена страница?
Подскажите как можно узнать сколько раз была обновлена страница?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru