L'appel d'une méthode de la même classe
Je suis en train d'écrire une classe pour un simple jeu de 4 dans une rangée, mais je suis confronté à un problème appelant une méthode de la même classe. Voici l'ensemble de la classe par souci d'exhaustivité:
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)
Je suis en train d'appeler checkLine() à partir de l'enregistrement(), mais je reçois l'erreur "NameError: nom global 'checkLine" n'est pas défini". Lorsque j'appelle la Grille.checkLine() au lieu de cela, je reçois "TypeError: 'module' objet n'est pas appelable"
Comment dois-je appeler checkLine()?
EDIT:
@beer_monk
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)
- quelle version de python?
- Je suis en utilisant 2.7.1
Vous devez vous connecter pour publier un commentaire.
Se débarrasser de la classe. L'utilisation de la plaine des fonctions et le niveau de module variable pour
grid
.La classe n'est pas vous aider de quelque façon.
PS. Si vous voulez vraiment appeler
checkline
à partir de l'intérieur de la classe, vous feriez appelGrid.checkline
. Par exemple:imprime
checkLine
-->Grid.checkLine
, et ajouterGrid.reset()
etGrid.check()
à la fin, le code que vous avez posté, s'exécute sans erreur soulevée. Mais, vraiment, la réponse est d'arrêter l'utilisation de la classe, ou arrêter d'utiliser staticmethods. Comme il est, vous n'êtes pas en utilisant des classes qu'ils ont été destinés.Syntaxe:
Exemple:
Contrairement à java ou c++, python, toutes les méthodes de la classe doit accepter l'instance de classe que la première variable. Dans à peu près tous seul code python ive vu, l'objet est appelé
self
. Par exemple:Voir http://docs.python.org/tutorial/classes.html
Remarque que dans les autres langues, la traduction se fait automatiquement
Il y a plusieurs problèmes dans la définition de votre classe. Vous n'avez pas défini de tableau qui que vous utilisez dans votre code. Également dans le checkLine appel en envoyant un int, et dans sa définition que vous essayez d'indice il. En laissant de côté, j'espère que vous vous rendez compte que vous êtes en utilisant staticmethods pour tous vos méthodes de la classe ici. Dans ce cas, chaque fois que vous êtes caling vos méthodes au sein de votre classe, vous avez encore besoin de les appeler via votre classe de la classe object. Donc, dans votre classe, lorsque vous appelez checkLine, c'est comme de la Grille.checkLine Qui devrait résoudre votre NameError problème.
Aussi, il semble qu'il y a un problème avec votre module d'importations. Vous pourriez avoir importé un Module par le nom de la Grille et vous devez avoir une classe appelée Grille ici aussi. Que Python est de penser que vous appelez de vos modules importés de la Grille de la méthode,qui n'est pas appelable. (Je pense,il n'y a pas plein de photo disponible ici pour voir pourquoi le TypeError est issu)
La meilleure façon de résoudre le problème, l'utilisation de Classes comme ils sont le plus utilisés, à savoir créer des objets et des méthodes d'appel sur ces objets. Également utiliser des espaces de noms. Et pour tous ces vous pouvez démarrer avec une bonne introduction, comme Python tutoriel.
Un retravaillé exemple (on l'espère en montrant une meilleure utilisation des classes!)
Au lieu de fonctionner sur un objet, vous êtes réellement modifier la classe elle-même. Python permet de faire ça, mais c'est pas vraiment ce que les classes sont pour. Si vous rencontrez quelques problèmes
-Vous ne serez jamais en mesure de faire plusieurs Grilles de cette façon
Après votre définition de la grille, essayez de l'instanciation de votre grille et de l'appel de méthodes sur elle comme ce
Pour le faire, vous devez d'abord modifier l'ensemble des définitions de méthode pour prendre le "soi" en tant que votre première variable, et en vérifier, appel auto.checkLine()
Aussi, votre répété vérification appelle une boucle FOR. Vous n'avez pas besoin d'écrire le cas.
Programmeur Java ici, voici comment je l'ai eu pour appeler une méthode interne: