2010-07-07 2 views
0

J'ai une classe simple socket: MySocketLib.py ..Python - utilisation de 'auto' - Noob ici va fou en essayant de le comprendre

import socket 

class socklib(): 
    def create_tcp_serversocket(self,port): 
     serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     serversocket.bind((socket.gethostname(), port)) 
     serversocket.listen(5) 
     return serversocket 

    def send_msg(self, sock, msg, msglen): 
     ... blah blah ... 

    def recv_msg(self, sock, msglen): 
     ... blah blah .... 

Mon fichier principal est Server.py comme suit:

import MySocketLib 

class serverclass(): 

    def __init__(self,port): 
     self.servsock = 0 
     self.port = port 

    def run(self): 
     self.servsock = self.create_tcp_serversocket(self.port) 
     (clientsock, address) = self.servsock.accept() # ERROR: 'SELF' not defined 
     ... blah blah ... 

############################# 
### Main startup code 

if __name__ == '__main__': 
    server = serverclass(2000) # server is on port 2000 
    server.run() 

Je continue à obtenir l'erreur ci-dessous:

File "D:\CodeLearn\Server.py", line 14, in serverclass 
(clientsock, address) = self.servsock.accept() 
NameError: name 'self' is not defined 

Je n'arrive pas à maîtriser le concept de "soi". Parfois, il semble nécessaire et parfois non. Pourquoi aurais-je besoin de définir 'self' ici quand c'est un mot-clé python?


Merci à tous ... c'était en effet les onglets et les problèmes d'espacement. J'utilise eclipse et dans les préférences j'ai défini les préférences "Editor" pour utiliser les espaces lors de la tabulation.

+1

En quoi 'serverclass' et' socklib' sont-ils liés? – SilentGhost

+0

En outre, dans le code, vous montrez erreur pertinente n'est pas sur la ligne 14, mais sur la ligne 11. Je suppose que vous ne nous montrez pas ce qui vous donne cette erreur, n'est-ce pas? – SilentGhost

+0

Où avez-vous lu que 'self' est un mot-clé Python? –

Répondre

4

Ne pas utiliser les onglets dans le code source Python. Configurez votre éditeur pour toujours utiliser des espaces.

self n'est pas un mot-clé Python, c'est une convention. C'est le nom habituel de "l'instance" d'une classe que vous utilisez. Exemple:

class X: 
    def __init__(self, v): self.v = v 

a = X(1) 
b = X(2) 
print a.v, b.v 

Lorsque ce code est exécuté, le moteur d'exécution de Python éventuellement allouer de la mémoire pour deux instances de X auxquelles elle attribue à a et b respectivement. S'il n'y avait pas quelque chose comme self, vous devez écrire:

a = X() 
a.v = 1 
b = X() 
b.b = 2 
print a.v, b.v 

Et vous obtiendrez une erreur parce que vous avez écrit b.b au lieu de b.v. De plus, les méthodes d'appel serait carrément laid:

class X: 
    def set(v): ???.v = v 

Comment diriez-vous « accéder à la référence v qui a été attribué à __init__ de X »?

Une solution serait de passer la référence d'instance (le pointeur vers la mémoire qui a été allouée pour X) comme paramètre:

class X: 
    def set(a, v): a.v = v 

a.set(a, 1) # Holy ugly! 

Tout le monde utiliserait des noms différents et nous tous violer DRY et il serait être un gâchis. Donc ce que Python a fait est:

class X: 
    def set(self, v): self.v = v 

a.set(1) # while "set" runs, "self" == "a" 
b.set(2) # while "set" runs, "self" == "b" 

Cela dit, je ne sais pas pourquoi le code ci-dessus échoue. self est évidemment défini ou l'erreur se produirait déjà dans la première ligne de votre méthode run().Donc, je suppose que vous les espaces mixtes et onglets pour l'indentation et qui confond Python et Sées:

def run(self): 
    self.servsock = self.create_tcp_serversocket(self.port) 
(clientsock, address) = self.servsock.accept() # ERROR: 'SELF' not defined 

Ensuite, il tenterait d'évaluer self.servsock.accept() alors qu'il analyse la définition de classe. A ce moment, il n'y a pas encore d'instance (la classe n'existe pas!) Donc self n'est pas disponible non plus. Conclusion: Ne jamais mélanger les onglets et les espaces.

2

Il peut s'agir d'une erreur d'indentation. Fichier

"D:\CodeLearn\Server.py", line 14, in serverclass
Ce que Meen
(clientsock, address) = self.servsock.accept()
est pas à l'intérieur run fonction, mais ServerClass se

0

Votre indentation est erronée, donc __init__() et run() sont interprétées comme des fonctions de niveau supérieur - sans paramètre self automatique. Ce dont vous avez besoin est:

class serverclass: 

    def __init__(self,port): 
     self.servsock = 0 
     self.port = port 

    def run(self): 
     self.servsock = self.create_tcp_serversocket(self.port) 
     (clientsock, address) = self.servsock.accept() # ERROR: 'SELF' not defined 
     ... blah blah ... 
+0

Si ce sera le cas alors AttributeError se produira à la ligne avec server.run() –

+0

c'est exactement ce que l'OP a – SilentGhost

+0

Will be "AttributeError: l'instance serverclass n'a pas d'attribut 'run'" –

Questions connexes