Счетчик экземпляров класса 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), )

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

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

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

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

class ExampleInstance: instances_count = 0 def __init__(self): ExampleInstance.instances_count += 1 for _ in range(5): _ = ExampleInstance() print("Количество экземпляров:", ExampleInstance.instances_count)

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

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), )
TypeError: __init__() takes exactly 1 argument (2 given)

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

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

Вы передаете два аргумента в конструктор
Покажите как вы создаете объекты

Добавлено через 32 секунды

def __init__(self): ListExtensions.instances_count += 1

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

а да, прошу прощения, но ошибка та же

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

request.ListExtensions(self.display)

(вся эта бальда пописана в файле request.py)

instances_count = 0 def __init__(self): ListExtensions.instances_count += 1
def __init__(self, display): super().__init__(display) ListExtensions.instances_count += 1

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

def __init__(self, display): super().__init__(display) ListExtensions.instances_count += 1
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), )
super().__init__(display) TypeError: super() takes at least 1 argument (0 given)

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

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

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() # Также в первом аргументе передается класс
Number of instances: 1 Number of instances: 2 Number of instances: 2

Лутц М. Изучаем Python (4-е издание, 2011) стр. 894

Читайте также:  Создание и оформление html

Добавлено через 4 минуты
kravam, Используя данный пример, можете соответствующим образом доработать свой класс.
Или Вы не можете трогать тот класс?

Лучший ответ

Сообщение было отмечено kravam как решение

Решение

def __init__(self, display): super(ListExtensions, self).__init__(display) ListExtensions.instances_count += 1

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

Добавлено через 3 минуты
kravam, Если у Вас питон не 3.Х то читайте Лутца, те страницы, которые я указал. Там есть варианты решения и для питона 2.Х.

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

def __init__(self, display): super(ListExtensions, self).__init__(display) ListExtensions.instances_count += 1
import sys; class MyClass(): pass; x = MyClass(); print(sys.getrefcount(MyClass) - 5);

Достаточно просто посчитать ссылки на объект.
Этот код выведет только кол-во экземпляров. Даже если приписать y = x , выведет 1:

x = MyClass(); y = x; print(sys.getrefcount(MyClass) - 5);

Добавлено через 2 минуты
Правда, a = MyClass; тоже будет считаться. Но если сделать парочку модификаций, то будет всё путём.

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 № saved in the variable "".'); if count == 0: print(f'Cannot find instances of MyClass.');

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

Вы видимо считаете, что здесь две ссылки на объект-класс. Но здесь на объект-класс одна ссылка. Она находится в переменной являющейся именем класса, то есть в переменной MyClass. И сколько бы раз не была использована эта переменная, что бы вызвать класс для создания экземпляра класса, количество ссылок на объект-класс будет равно одной. Количество ссылок, которые ссылаются на объект-класс может увеличится, если мы ссылку поместим еще и в другую переменную.

Вот теперь ссылок на объект-класс стало две. Вторая ссылка помещена в переменную z. И теперь мы через переменную z тоже можем вызывать объект-класс для создания экземпляра класса.

Вызывает объект-класс для создания еще одного экземпляра класса. Подозреваю, что количество вызовов z() для создания новых экземпляров класса Вы не учитываете. Но проверять это мне лень.
Посчитать количество созданных экземпляров таким способом, можно только если найти все переменные, которые хранят ссылки на этот объект-класс и посчитать общее количество вызовов с помощью каждой из этих переменных.
На самом же деле, питон это интерпретатор, и обычно мы всегда можем заменить кусок существующего кода, на свой код, что и делает kravam, с помощью zhurban.
Зачем нужны Ваши фантазии, мне честно говоря не понятно.
Однако я просто высказал свое мнение и в дискуссию с Вами вступать не намерен. Удачи.

Читайте также:  Таблица с фильтрами html

Источник

Как написать полезный счетчик экземпляров на Python

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

Зачем считать экземпляры?

Во-первых, зачем нам подсчитывать экземпляры объекта? Вот несколько примеров использования:

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

Основной подход

Простой подход к подсчету экземпляров — просто добавить его прямо в свой класс:

class A: numInstances = 0 def __init__(self): A.numInstances += 1 self.count = A.numInstances

Это создает переменную класса с именем numInstances , которая отслеживает общее количество созданных экземпляров, и переменную экземпляра с именем count , которая содержит номер экземпляра для данного экземпляра.

a = A() b = A() a.count # returns 1 b.count # returns 2 a.numInstances # returns 2 b.numInstances # returns 2

Делаем его многоразовым

Конечно, как хорошие программисты, мы хотим сделать эту функцию подсчета многоразовой. Затем несколько классов можно подсчитать независимо, унаследовав некоторый заранее созданный Countable класс.

Наш первый инстинкт — сделать что-то вроде этого:

class B : A pass # implement specialist functionality in B

Проблема в том, что B и A теперь используют одну и ту же переменную numInstances , предоставленную A , что дает нам:

b = B() b.count # returns 3, not 1 as expected

Однако есть способ решить эту проблему с помощью метаклассов Python. Это позволяет нам создать отдельное количество экземпляров для каждого подкласса:

Класс Countable теперь можно использовать как миксин:

class A(Countable): pass class B (Countable): pass a = A() b = B() a.count # prints 1 b.count # also prints 1. numInstances is no longer shared

Спасибо за прочтение. Если вы нашли это полезным, ознакомьтесь с другими моими статьями на Medium:

Источник

How to Count the Number of Objects in a Class in Python

In this article, we show how to count the number of objects in a class in Python.

So, let’s say we create a class called Student.

This class will contain Student objects, Student 1, Student 2, Student 3, Student 4, etc.

So it will contain a number of students, maybe representing a class of students.

While we’re in the process of creating these Student objects (representing students), we may want to know how many Student objects we’ve created (which would represent the number of students in a class, for example).

So how can we do this in Python?

If we’re creating a class in Python, you would want to create an __init__ method so that you can initialize what values get passed into each Student object, for example, the student’s name, age, grade, etc.

The __init__ method in Python would be a constructor in other OOP languages.

Читайте также:  Задача статистика acmp решение питон

The __init__ method is called every time an object of a class is created. Therefore, we put a simple incrementor in the __init__ method that counts up each time an object is created.

In our example code below, we create a class named Student and define an __init__ method. We then create Students objects. Lastly, we print out the number of Student objects that have been created.

We show all of this in the code below.

So let’s now go through this code.

So, we create a class named Student.

We then create a class variable named number_of_students and initialize it to the value of 0.

We then create an __init__ method to determine what attributes must get passed to each new object of the Student class. In this case, it is name and grade.

Since the __init__ method is called every time a new object is created, we can take advantage of this fact to increment our class variable number_of_students in it. Since every new object created in the class must pass through the __init__ method, by incrementing the number_of_students variable by 1 each time, we can know how many objects are in the class.

Remember that number_of_students is a class variable. This means that to reference it we must use the statement, Student.number_of_students, not simply number_of_students (which will cause an UnboundLocalError).

We then create 5 Student objects.

We then print out the number of students in the class, which in this case is 5, since the number of objects we created is 5.

Thus, this is how we can count the number of objects in a class in Python.

Источник

Python-сообщество

[RSS Feed]

  • Начало
  • » Python для новичков
  • » Декоратор класса для подсчета экземпляров

#1 Май 26, 2014 16:13:00

Декоратор класса для подсчета экземпляров

дочитываю книгу М. Лутца “Изучаем Python” и пришла в голову идея создать декоратор класса, который подсчитывает кол-во созданных экземпляров.

Реализовать задачу полностью не удалось, вот что получилось:

def count(aClass): aClass.numInstances = 0 class Wrapper(aClass): def __init__(self, *args, **kargs): aClass.numInstances += 1 aClass.__init__(self, *args, **kargs) return Wrapper if __name__ == '__main__': @count class Spam(): def __init__(self): print('in Super.method') def printerS(self): print('blablabla') @count class Sub(Spam): pass @count class Other(Spam): def printer(self): print('lalala') x = Spam() y1, y2 = Sub(), Sub() z1, z2, z3 = Other(), Other(), Other() print(x.numInstances, y1.numInstances, z1.numInstances) print(Spam.numInstances, Sub.numInstances, Other.numInstances) 
in Super.method
in Super.method
in Super.method
in Super.method
in Super.method
in Super.method
6 2 3
6 2 3

Счетчик класса Spam подсчитывает не только экземпляры класса Spam, но и экземпляры классов, которые наследут класс Spam.

Как можно исправить код, что бы счетчик считал корректно экземпляры, то есть что бы код проверки выводил в конце “1 2 3” вместо “6 2 3”?

Отредактировано WoMax (Май 27, 2014 14:46:22)

Источник

Оцените статью