嵌套函数 class 认为 'self' 作为参数 - Python

Functions of nested class thinks 'self' as an argument - Python

我正在尝试制作一款井字游戏。

我有一个 class,Player,还有一个嵌套 class,Check,在里面。

这是我的完整代码:

class Player: # Player class
'''this is a class for the player in a tic-tac-toe game'''

def __init__(self, counter): # initialize
    self.counter = counter # set player counter

def place(self, x, y): # functions directly interfering with data can global
    '''this function helps with placing counters on the grid'''
    global grid
    grid[y][x] = self.counter

class Check:
    '''checks if a player wins or loses'''

    def check_vertical(self, grid): # checking functions avoid globaling
        '''check if there are three counters in a row vertically'''
        for row in range(3):
            if grid[row][0] and grid[row][1]\
               and grid[row][2] == self.counter:
                return True

    def check_horiontal(self, grid): # checking functions avoid globaling
        '''check if there are three counters in a row horizontally'''
        for column in range(3):
            if grid[0][column] and grid[1][column]\
               and grid[2][column] == self.counter:
                return True

    def check_diagonal(self, grid): # checking functions avoid globaling
        '''check if there are three counters in a row diagonally'''
        if grid[0][0] and grid[1][1] and grid[2][2] or\
           grid[0][2] and grid[1][1] and grid[2][0] == self.counter:
            return True

    def check_all(self, grid):
        '''check if there are three counters in a row in any direction'''
        return (self.check_vertical(self, grid) or\
                self.check_horizontal(self, grid) or\
                self.check_diagonal(self, grid))

所以,当我尝试在 shell 中测试它时:

>>> player = Player("O")
>>> player.Check.check_all(tic_tac_toe_grid)

Python 抛出错误:

Traceback (most recent call last):
  File "<pyshell#34>", line 1, in <module>
    a.Check.check_all(grid)
TypeError: check_all() missing 1 required positional argument: 'grid'

Python 认为 self 是必需的参数。

我的代码有什么问题?

CheckPlayer 中的嵌套 class,您可以使用 Player.Check 或使用 Player 实例访问它 - 在您的情况下 player.

嵌套 class 的行为与普通 class 的行为相同。它的方法仍然需要一个实例。该方法的 self 参数告诉您它对实例进行操作。如果您不需要 class 上的任何状态,您有两个选择:

  1. 将所有方法从 Check 移到它自己的模块中,并将函数放在其中,但没有任何 class。或者...
  2. Check 中的所有方法设为静态 (@staticmethod)。不过,这是一种反模式。

None 这与 Check 是嵌套的 class.

有关

首先,Python 认为 self 是必需的参数,因为它是。您将其显式声明为参数:

def check_all(self, grid):

当您正常调用方法时,在 class 的实例上,例如 thingy.method(foo),Python 会将 thingy 变成 self

但是您不是在 Check 的实例上调用该方法,而是在 Check 本身上调用它。这是合法的,但不寻常。当你这样做时,你需要显式传递一个实例作为 self.

这才是你真正的问题——你甚至 没有 一个实例。并且大概您创建了 class,带有属性和 __init__ 方法以及所有内容,因为您需要 class 的实例。 (如果你 不需要 需要 class,那么你应该摆脱 class 并只创建 Player 的函数方法,或者top-level 个函数。)

因此,消除此错误很容易:

player.Check().check_all(tic_tac_toe_grid)

但是您几乎可以肯定想要做的是在某处创建一个Check()实例,您可以在需要时使用它。每个玩家是否拥有一张支票?然后是这样的:

class Player:
    def __init__(self, counter): # initialize
        self.counter = counter # set player counter
        self.check = Check()

然后就可以使用了:

player.check.check_all(tic_tac_toe_grid)

我实际上不知道你的对象模型是否应该是这样的,但希望你知道。