Skip to main content
 首页 » 编程设计

python之从同一个类调用方法

2025年05月04日10kuangbin

我正在为一个连续 4 人的简单游戏编写一个类,但我在调用同一个类中的方法时遇到了问题。为了完整起见,这里是整个类(class):

class Grid: 
    grid = None 
    # creates a new empty 10 x 10 grid 
    def reset(): 
        Grid.grid = [[0] * 10 for i in range(10)] 
    # places an X or O 
    def place(player,x,y): 
        Grid.grid[x][y] = player 
    # returns the element in the grid 
    def getAt(x,y): 
        return Grid.grid[x][y] 
    # checks for wins in a certain direction 
    def checkLine(player,v,count,x,y): 
        x = x+v[0] 
        y = y+v[1] 
        if x < 0 or x > 9: 
            return 
        if y < 0 or y > 9: 
            return 
        if Grid.grid[x][y] == p: 
            count = count+1 
            if count == 4: 
                return True 
            checkLine(player,v,count,x,y) 
        return False 
    # returns the number of the player that won 
    def check(): 
        i = 'i' 
        for x in range(0,10): 
            for y in range(0,10): 
                if Grid.grid[x][y] > 0: 
                    p = Grid.grid[x][y] 
                    f = checkLine(p,0,array(i,[1,0]),x,y) 
                    if f: 
                        return p 
                    f = checkLine(p,0,array(i,[0,1]),x,y) 
                    if f: 
                        return p 
                    f = checkLine(p,0,array(i,[1,1]),x,y) 
                    if f: 
                        return p 
                    f = checkLine(p,0,array(i,[-1,0]),x,y) 
                    if f: 
                        return p 
                    f = checkLine(p,0,array(i,[0,-1]),x,y) 
                    if f: 
                        return p 
                    f = checkLine(p,0,array(i,[-1,-1]),x,y) 
                    if f: 
                        return p 
                    f = checkLine(p,0,array(i,[1,-1]),x,y) 
                    if f: 
                        return p 
                    f = checkLine(p,0,array(i,[-1,1]),x,y) 
                    if f: 
                        return p 
        return 0 
    reset = staticmethod(reset) 
    place = staticmethod(place) 
    getAt = staticmethod(getAt) 
    check = staticmethod(check) 
    checkLine = staticmethod(checkLine) 

我试图从 check() 调用 checkLine(),但我收到错误“NameError:全局名称‘checkLine’未定义”。当我改为调用 Grid.checkLine() 时,我得到“TypeError: 'module' object is not callable”

如何调用 checkLine()?

编辑:

@啤酒僧

class Grid(object): 
    grid = None 
    # creates a new empty 10 x 10 grid 
    def reset(self): 
        Grid.grid = [[0] * 10 for i in range(10)] 
    # places an X or O 
    def place(self,player,x,y): 
        Grid.grid[x][y] = player 
    # returns the element in the grid 
    def getAt(self,x,y): 
        return Grid.grid[x][y] 
    # checks for wins in a certain direction 
    def checkLine(self,player,v,count,x,y): 
        x = x+v[0] 
        y = y+v[1] 
        if x < 0 or x > 9: 
            return 
        if y < 0 or y > 9: 
            return 
        if Grid.grid[x][y] == p: 
            count = count+1 
            if count == 4: 
                return True 
            checkLine(self,player,v,count,x,y) 
        return False 
    # returns the number of the player that won 
    def check(self): 
        i = 'i' 
        for x in range(0,10): 
            for y in range(0,10): 
                if Grid.grid[x][y] > 0: 
                    p = Grid.grid[x][y] 
                    for vx in range(-1,2): 
                        for vy in range(-1,2): 
                            f = self.checkLine(p,0,array(i,[vx,vy]),x,y) 
                            if f: 
                                return p 
        return 0 
    reset = staticmethod(reset) 
    place = staticmethod(place) 
    getAt = staticmethod(getAt) 
    check = staticmethod(check) 
    checkLine = staticmethod(checkLine) 

请您参考如下方法:

摆脱类。为 grid 使用普通函数和模块级变量。 该类(class)对您没有任何帮助。

附言。如果您真的想从类中调用 checkline,您可以调用 Grid.checkline。例如:

class Foo: 
    @staticmethod 
    def test(): 
        print('Hi') 
    @staticmethod 
    def test2(): 
        Foo.test() 
 
Foo.test2()        

打印

Hi