Listing all instance of a class

前端 未结 3 1651
醉话见心
醉话见心 2021-01-28 06:42

I wrote a Python module, with several classes that inherit from a single class called MasterBlock. I want to import this module in a script, create several instance

相关标签:
3条回答
  • 2021-01-28 07:18

    What about adding a class variable, that contains all the instances of MasterBlock? You can record them with:

    Class MasterBlock(object):
    
        all_instances = []  # All instances of MasterBlock
    
        def __init__(self,…):
            …
            self.all_instances.append(self)  # Not added if an exception is raised before
    

    You get all the instances of MasterBlock with MasterBlock.all_instances (or instance.all_instances).

    This works if all base classes call the __init__ of the master class (either implicitly through inheritance or explicitly through the usual super() call).

    0 讨论(0)
  • 2021-01-28 07:20

    If you add a __new__() method as shown below to your base class which keeps track of all instances created in a class variable, you could make the process more-or-less automatic and not have to remember to call something in the __init__() of each subclass.

    class MasterBlock(object):
        instances = []
        def __new__(cls, *args, **kwargs):
            instance = super(MasterBlock, cls).__new__(cls, *args, **kwargs)
            instance.instances.append(instance)
            return instance
    
        def main(self):
            print('in main of', self.__class__.__name__)  # for testing purposes
    
    class RandomA(MasterBlock):
        def __init__(self):
            pass
        # inherit the main function
    
    class AnotherRandom(RandomA):  # works for sub-subclasses, too
        def __init__(self):
            pass
        # inherit the main function
    
    a=RandomA()
    b=AnotherRandom()
    c=AnotherRandom()
    
    for instance in MasterBlock.instances:
        instance.main()
    

    Output:

    in main of RandomA
    in main of AnotherRandom
    in main of AnotherRandom
    
    0 讨论(0)
  • 2021-01-28 07:34

    Here's a way of doing that using a class variable:

    class MasterBlock(object):
        instances = []
        def __init__(self):
            self.instances.append(self)
        def main(self):
            print "I am", self
    
    class RandomA(MasterBlock):
        def __init__(self):
            super(RandomA, self).__init__()
            # other init...
    
    class AnotherRandom(MasterBlock):
        def __init__(self):
            super(AnotherRandom, self).__init__()
            # other init...
    
    
    a = RandomA()
    b = AnotherRandom()
    c = AnotherRandom()
    # here I need to get list_of_instances=[a,b,c]
    
    for instance in MasterBlock.instances:
        instance.main()
    

    (you can make it simpler if you don't need __init__ in the subclasses)

    output:

    I am <__main__.RandomA object at 0x7faa46683610>
    I am <__main__.AnotherRandom object at 0x7faa46683650>
    I am <__main__.AnotherRandom object at 0x7faa46683690>
    
    0 讨论(0)
提交回复
热议问题