获取主类和所有子类的所有实例

2024-05-15 05:47:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要你们的建议,伙计们,因为我对编程特别是面向对象编程相当陌生。我需要的是分别获得每个子类的所有实例,以及所有这些实例。我就是搞不懂。非常感谢B类,我想用它作为一个可记录的函数,但也许这只是胡说八道

class A:

    def __init__(self, name):
        self.__name = name

    def __str__(self):
        return f'\n\tName: {self.__name}'

class Loggable(A):

    instances = []

    def __init__(self):
        self.__class__.instances.append(self)


class C(Loggable):

    def __init__(self, name, x1, x2):
        super(Loggable, self).__init__(name)
        super().__init__()
        self.__x1 = x1
        self.__x2 = x2  

    def __str__(self):
        return f'{super().__str__()}\n\tX1: {self.__x1}\n\tX2: {self.__x2}'

class D(Loggable):

    def __init__(self, name, g1, g2):
        super(Loggable, self).__init__(name)
        super().__init__()
        self.__g1 = g1
        self.__g2 = g2  

    def __str__(self):
        return f'{super().__str__()}\n\tG1: {self.__g1}\n\tG2: {self.__g2}'

class TableDump(C, D):

    @classmethod
    def dumpC(cls):
        for instance in cls.instances:
            print(instance)

    @classmethod
    def dumpD(cls):
        for instance in cls.instances:
            print(instance) 

   
def main():

     c1 = C("C1" , "C1", "C1")
     c2 = C("C2" , "X1", "X2")
     c3 = C("C3" , "X1", "X2")

     d1 = D("D1" , "D1", "D1")
     d2 = D("D2" , "D2", "D2")
     d3 = D("D3" , "D3", "D3")

     TableDump.dumpC()


if __name__ == '__main__':
    main()



Tags: instancesinstancenameselfinitdefclasscls
2条回答

好的,从您描述当前代码的错误的评论中,我想我终于明白了您想知道如何做。一种方法是保留所有实例的列表,然后过滤所有特定类型的实例

下面是基于您问题中的代码的两种方法的说明。请注意,我删除了您拥有的Loggable类,因为它不是严格必需的-但是如果出于某种原因需要它,可以将其放回

class A:
    instances = []

    def __init__(self, name):
        self.__name = name
        self.__class__.instances.append(self)

    def __str__(self):
        return f'\n\tName: {self.__name}'


class C(A):
    def __init__(self, name, x1, x2):
        super().__init__(name)
        self.__x1 = x1
        self.__x2 = x2

    def __str__(self):
        return (f'{super().__str__()}\n'
                f'\tX1: {self.__x1}\n\tX2: {self.__x2}')

class D(A):
    def __init__(self, name, g1, g2):
        super().__init__(name)
        self.__g1 = g1
        self.__g2 = g2

    def __str__(self):
        return (f'{super().__str__()}\n'
                f'\tG1: {self.__g1}\n\tG2: {self.__g2}')


class TableDump(A):
    @classmethod
    def dump_instances(cls, Kind):
        """ Generic instance dumper. """
        for instance in cls.instances:
            if type(instance) is Kind:
                print(instance)

    @classmethod
    def dumpC(cls):
        for instance in cls.instances:
            if type(instance) is C:
                print(instance)

    @classmethod
    def dumpD(cls):
        for instance in cls.instances:
            print(instance)


def main():
    c1 = C("C_name1", "C1", "C1")
    c2 = C("C_name2", "X1", "X2")
    c3 = C("C_name3", "X1", "X2")

    d1 = D("D_name4", "D1", "D1")
    d2 = D("D_name5", "D2", "D2")
    d3 = D("D_name6", "D3", "D3")

#    TableDump.dumpC()
    TableDump.dump_instances(C)  # Same results as previous line.


if __name__ == '__main__':
    main()

抱歉重写,但我这样做是为了简单:

class A:
    instances = []
    
    def __init__(self):
        self.instances.append(self)

class B(A):
    pass

现在您可以通过listA.instances访问类A的所有实例和所有子类

相关问题 更多 >

    热门问题