Python 返回该类的所有实例的另一个方法返回的值的总和?

Python 返回该类的所有实例的另一个方法返回的值的总和?,python,python-3.x,Python,Python 3.x,您可以使用类变量: class Square(): def __init__(self, side): self.side = side def getArea(self): return side*side def getAreaOfAllInstances(self): {need to write this method} s1 = Square(2) s2 = Square(3) print(s1.getAre

您可以使用类变量:

class Square():
    def __init__(self, side):
        self.side = side

    def getArea(self):
        return side*side

    def getAreaOfAllInstances(self):
       {need to write this method}

s1 = Square(2)
s2 = Square(3)

print(s1.getAreaOfAllInstances()) ===> This should print 13 (2*2 + 3*3)
print(s2.getAreaOfAllInstances()) ===> This should print 13 (2*2 + 3*3)`
但这不是一个干净的解决方案。我宁愿创建另一个类来跟踪正方形。像这样:

class Square():
    squares = []
    def __init__(self, side):
        self.side = side
        self.squares.append(self)

    def getArea(self):
        return self.side * self.side

    def getAreaOfAllInstances(self):
        return sum(s.getArea() for s in self.squares)

s1 = Square(2)
s2 = Square(3)

print(s1.getAreaOfAllInstances()) #===> This should print 13 (2*2 + 3*3)
print(s2.getAreaOfAllInstances()) # ===> This should print 13 (2*2 + 3*3)
当然你可以:

class Square:
    def __init__(self, side):
        self.side = side

    def getArea(self):
        return self.side * self.side


class SquareContainer:
    def __init__(self):
        self.squares = []

    def create_square(self, side):
        square = Square(side)
        self.squares.append(square)
        return square

    def getAreaOfAllInstances(self):
        return sum(s.getArea() for s in self.squares)

sc = SquareContainer()
s1 = sc.create_square(2)
s2 = sc.create_square(3)

print(sc.getAreaOfAllInstances())

但是请注意,这意味着永远不会收集
Square
s,除非您清空
Square.\u all\u instances
属性。

您可以使用classmethods来实现这一点

class Square():

    _all_instances = []

    def __init__(self, side):
        self.side = side
        self._all_instances.append(self)

    def getArea(self):
        return side*side

    @classmethod
    def getAreaOfAllInstances(cls):
        return sum(inst.getArea() for inst in cls._all_instances)
输出:

class Square(object):
    instances_list = []  # Property of the class

    def __init__(self, side):
        self.trackInstances(self)
        self.side = side

    def getArea(self):
        return self.side**2

    @classmethod
    def trackInstances(cls, self):
        self.instances_list.append(self)

    @classmethod
    def getAreaOfAllInstances(cls):
        areaSum = sum(map(lambda i: i.getArea(), cls.instances_list))
        print('square of all instances: {}'.format(areaSum))

s1 = Square(2)
s2 = Square(3)

s2.getAreaOfAllInstances()

请注意,只执行了
s2.getAreaOfAlliances
,它给出了所有实例的区域。

您需要自己在某个地方跟踪所有实例,无论是作为辅助数据结构还是作为类的属性。您为什么需要这样做?@AzatIbrakov,只是想知道这是否可行?参考资料:您如何知道您不再需要特定的
Square
,并且可以删除它,以便gc能够抓取它?或者可以存储所有(可能无限)实例?
square of all instances: 13