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)`
Asked
Active
Viewed 255 times
0
-
1You need to keep track of all instances yourself somewhere, be it an auxiliary data structure or as an attribute on the class. – juanpa.arrivillaga Jul 24 '18 at 09:01
-
2why would you need that? – Azat Ibrakov Jul 24 '18 at 09:02
-
@AzatIbrakov, just wanted to know if this is possible to do it? – Ashok Jul 24 '18 at 09:10
-
Reference https://stackoverflow.com/questions/328851/printing-all-instances-of-a-class – MaNKuR Jul 24 '18 at 09:10
-
how would you know that you don't need specific `Square` anymore and can remove it so gc can grab it? or it is ok to store all (potentially infinite) instances? – Azat Ibrakov Jul 24 '18 at 09:22
3 Answers
1
You can use class variable:
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)
But that's not a clean solution. I'd rather create another class, to keep track of Squares. Like this:
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())

Kiro
- 920
- 10
- 24
0
Sure you can:
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)
Note however that this means that Square
s will never be gargabe collected, except if you empty the Square._all_instances
attribute.

Giacomo Alzetta
- 2,431
- 6
- 17
0
You can use classmethods to achieve this.
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()
Output:
square of all instances: 13
Note that only s2.getAreaOfAllInstances
is executed, and it gives the areas of all instances.

madjaoue
- 5,104
- 2
- 19
- 31