嵌套函数 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
是必需的参数。
我的代码有什么问题?
Check
是 Player
中的嵌套 class,您可以使用 Player.Check
或使用 Player
实例访问它 - 在您的情况下 player
.
嵌套 class 的行为与普通 class 的行为相同。它的方法仍然需要一个实例。该方法的 self
参数告诉您它对实例进行操作。如果您不需要 class 上的任何状态,您有两个选择:
- 将所有方法从
Check
移到它自己的模块中,并将函数放在其中,但没有任何 class。或者...
- 将
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)
我实际上不知道你的对象模型是否应该是这样的,但希望你知道。
我正在尝试制作一款井字游戏。
我有一个 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
是必需的参数。
我的代码有什么问题?
Check
是 Player
中的嵌套 class,您可以使用 Player.Check
或使用 Player
实例访问它 - 在您的情况下 player
.
嵌套 class 的行为与普通 class 的行为相同。它的方法仍然需要一个实例。该方法的 self
参数告诉您它对实例进行操作。如果您不需要 class 上的任何状态,您有两个选择:
- 将所有方法从
Check
移到它自己的模块中,并将函数放在其中,但没有任何 class。或者... - 将
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)
我实际上不知道你的对象模型是否应该是这样的,但希望你知道。