Counting instances of a class?

后端 未结 7 1455
失恋的感觉
失恋的感觉 2020-11-29 04:19

I\'ve been cleaning up some code from a module I\'m extending and I can\'t seem to find a way to Pythonify this code:

global_next_id = 1

class Obj:
  def __         


        
相关标签:
7条回答
  • 2020-11-29 04:23

    This should do the job:

    class Obj:
        _counter = 0
        def __init__(self):
            Obj._counter += 1
            self.id = Obj._counter
    
    0 讨论(0)
  • 2020-11-29 04:33

    I found the following solution:

    class Obj:
        counter = 0
    
        def __init__(self):
            type(self).counter += 1
    
        def __del__(self):
            type(self).counter -= 1
    

    It's better to use type(self).counter instead of Obj.counter

    0 讨论(0)
  • 2020-11-29 04:38
    class Obj:
        global_next_id =0
        def __init__(self):
            Obj.global_next_id += 1
    
    my_obj = Obj()
    print(Obj.global_next_id)
    
    0 讨论(0)
  • 2020-11-29 04:42
    class InstanceCounter(object):
      # the instance counter
      counter = 0
    
      def __init__(self, val):
        self.val = all
        # incrementing every time an instance is created
        InstanceCounter.counter += 1
    
      def set_val(self, val):
        self.val = val
    
      def get_val(self, val):
        return self.val
    
      # accessing the instance counter should be done through a class method
    
      @classmethod
      def get_counter(cls):  
        return cls.counter
    
    # See the instance counter as it increments as new instances are created
    a=InstanceCounter(5)
    print(a.get_counter())
    b=InstanceCounter(7)
    print(a.get_counter(), b.get_counter())
    c=InstanceCounter(9)
    print(a.get_counter(), b.get_counter(), c.get_counter())
    
    0 讨论(0)
  • 2020-11-29 04:44

    Try something like this:

    from itertools import count
    
    class Obj(object):
      _ids = count(0)
    
      def __init__(self):
        self.id = next(self._ids)
    
    0 讨论(0)
  • 2020-11-29 04:48

    Here is a way to count instances without descendant classes sharing the same id/count. A metaclass is used to create a separate id counter for each class.

    Uses Python 3 syntax for Metaclasses.

    import itertools
    
    class InstanceCounterMeta(type):
        """ Metaclass to make instance counter not share count with descendants
        """
        def __init__(cls, name, bases, attrs):
            super().__init__(name, bases, attrs)
            cls._ids = itertools.count(1)
    
    class InstanceCounter(object, metaclass=InstanceCounterMeta):
        """ Mixin to add automatic ID generation
        """
        def __init__(self):
            self.id = next(self.__class__._ids)
    
    0 讨论(0)
提交回复
热议问题