TIL

How to prevent overwriting properties of class instance

Python classes allows initialization of properties inline, but this is suprisingly problematic:

class Grid:
    start: int
    data: dict = {}
    def __init__(self, start):
        self.start = start
    def doStep1(self, likes):
        self.data['likes'] = likes
    def doStep2(self, views):
        self.data['views'] = views

bases = [1, 10]
grid1 = Grid(bases[0])
grid1.doStep1([2,3])
grid1.doStep2([4,5])

grid2 = Grid(bases[1])
grid2.doStep1([7,8])
grid2.doStep2([9,10])

print(grid1.data)
print(grid2.data)

Output is:

{'likes': [7, 8], 'views': [9, 10]}
{'likes': [7, 8], 'views': [9, 10]}

To achieve not overwriting variables move initialization of property to init method:

class Grid:
    start: int
    data: dict 
    def __init__(self, start):
        self.start = start
        self.data = {}
    def doStep1(self, likes):
        self.data['likes'] = likes
    def doStep2(self, views):
        self.data['views'] = views