[Tutor] instance method call issue

Osemeka Osuagwu abasiemeka at gmail.com
Sun Oct 14 14:34:26 CEST 2012


Hello people,
Firstly, thank you so much for all the assistance you provide so
selflessly through this medium.
I come from a functional programming background and have only recently
become serious with OOP.
For practice, I tried to implement John Conways 'Game of Life' without
a GUI and ran into some issues.
I understand instance, static and class methods but I'm still
struggling with when and where they should be used.
In the code below, I can't seem to get around calling an instance
method (__reality_check()) from within a class method (update_grid()),
I'm not even too sure that update_grid() should have been a class
method in the first place.
Please, I need help with this and any other advice on my coding style,
where I could've been more efficient etc.


class Grid:
        '''Grid(rows = 26, columns = 26) -> Provides a world object
for the cells in Game of Life'''
        from time import sleep
        from os import system
        from sys import platform

        #class data:
        __rows, __array, os_type = [''], [], platform

        @staticmethod
        def display_grid(generation, os_type):
                try:
                        (lambda x:Grid.system('cls') if 'win' in
os_type else Grid.system('clear'))(1)
                except:
                        print 'Cannot display Grid'
                print 'Now in Generation %d' %(generation)
                for line in Grid.__array:
                        print line
                return

        @staticmethod
        def extend_grid(thickness = 4, force_extend = False):
                '''extend_grid([thickness][, force_extend]) -->
Extends the edges of the grid by 4 units in
all directions if the boundary of the simulation comes close to the
edge. Extends anyway if force_extend option is True'''
                pass
                return

        @classmethod
        def update_grid(cls, generations, speed):
                '''Runs the 'Life' World simulation for the specified
number of generations at the given speed'''
                #control = input
                #while
                for times in range(generations + 1):
                        cls.extend_grid()
                        cls.__reality_check(Grid, 'all')
                        cls.display_grid(times, cls.os_type)
                        cls.sleep(speed)
                return

#------------------------------------------------------------------------------

        def __init__(self, rows = 26, col = 26):
                '''Create a 'rows' x 'col' grid'''
                Grid.__rows *= rows
                Grid.__array = [Grid.__rows] * col
                print 'A %d x %d cell World has been Created' %(rows, col)

        def __reality_check(self, num = 'all'):
                '''__reality_check([num]) -->Checks and updates the
state of the cell based on the number of 'alive' neighbors'''

                #check if reality check is for single cell or entire array
                if num == 'all':
                        for i in range(len(Grid.__array)):
                                for j in range(len(Grid.__array[i])):
                                        self.__reality_check((i,j))
                        return

                #Neighbor count check and update for single cell(num = row, col)
                elif num == tuple and len(num) == 2:
                        col, row, neighbor_count = num[1], num[0], 0
                        for x in range(row-1, row+2):
                                for y in range(col-1, col+2):
                                        #count only 'alive' neighbors
(includes the subject cell itself)
                                        neighbor_count = lambda x: x+1
if Grid.__array[x][y] == '##' else x
                        #correct the neighbor count value if subject
cell was counted
                        neighbor_count = lambda x: x-1 if
Grid.__array[row][col] == '##' else x

                        #update cell(x,y) state
                        Grid.__array[row][col] = lambda x:'##' if
neighbor_count == 3 else ''

                else:
                        print 'Wrong argument for reality check'
                return

        def edit_cell(self, cells, state = '##'):
                '''edit_cell(cells[, state]) --> Where cells is a list
of tuples containing coordinates of the cells to edit'''
                cells = cells
                for eachcell in cells:
                        Grid.__array[eachcell[0]][eachcell[1]] = state
                return

#To be moved to a different .py file after debugging.
world = Grid()
world.edit_cell([(10,10), (10, 11), (10, 12), (11, 10)], '##')
world.update_grid(5, 0.5)



p.s. I'm not yet completely through with coding some aspects like the
extend_grid() method'

Thank you
Abasiemeka


More information about the Tutor mailing list