Errores con variables globales. Python


quería saber si podeís ayudarme. Es la primera vez que programo en python y no sé muy bien como va, solo he programado en java. Lo siento si tengo fallos. El caso es que estoy haciendo un programa , con una clase y varias funciones def, pero me da varios errores sobre que las variables no están definidas, pero si que lo están, o por lo menos creo que sí. Aquí os dejo un pequeño ejemplo de como lo tengo:

class Cliente:  sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #server = ('', 69) #TFTP utiliza UDP como protocolo de transporte en el puerto 69 BLCKSIDE = 512 MAXBLCKSIDE = 32768 MAXDUP = 10 RETRANS = 3 SOCK_TO= 5 MINBLCKSIDE = 9  def __init__(self, ipLocal = "", puerto = 69):     self.filename = " "     self.mode = b"ascii"     self.opcode = None     self.ipLocal = ipLocal     self.puerto = puerto     self.timeout = timeout     self.sigBlock = 0     self.numBlock = {}     self.buffer = {}     self.data = {}     self.contDup = 0     self.dup = {}     self.duracion = 0 #tiempo desde que empieza hasta que termina     self.bps = 0     self.kbps = 0     self.inicio = 0     self.fin = 0     self.bytes = 0   iter = True #Do-While while iter == True:     op = menu()     self.inicio = time.time()      if op == 1: #SWITCH-CASE         solicitud_RRQ()         respuesta()     elif op == 2:         solicitud_WRQ()         respuesta()     else:         print("Para salir. Introduce QUIT")         entrada = input("TFTP@UDP > ")         if entrada.rstrip() == "QUIT":             sock.close()             sys.exit(0)     iter = False  def menu():     op = 0     print('elige una opción.\n'         + '1 --> Lerctura del fichero.\n'         + '2 --> Escribir en el fichero.\n'         + '3 --> Salir.\n')     try:          op = int(input())     except ValueError:         print('El valor introducido debe ser un número en el rango (1-3). Por favor vuelva a intentarlo.\n')         op = int(input())      return op  def tiempo(self):     self.duracion = self.fin - self.inicio     if self.duracion == 0:         self.duracion = 1     self.bps = (self.bytes*8.0) / self.duracion     self.kbps = self.bps /1024.0  def solicitud_RRQ(self):     self.opcode = 1     self.mode = self.mode.encode('ascii')      print('Por favor introduzca el nombre del archivo.\n')     self.filename = str(input("TFTP@UDP > "))     self.filename = self.filename.encode('ascii')      frmt = b"!H"     frmt += b"%dsx" % len(self.filename)     frmt += b"5sx"      datagrama = struct.pack(frmt, self.opcode, filename, self.mode)     self.sock.sendto(datagrama, """server""")     return self.filename #Tienes que mirar los ACks, sigBloque  def respuesta(self):     while True:         datagrama = self.sock.recvfrom()         opcode = struct.unpack("!H", datagrama[:2])         self.numBlock += struct.unpack("!H", datagrama[2:4])         if opcode == 3:             (self.opcode, self.buffer, self.numBlock, self.data) = data_decode()             for i in self.numBlock:                 if self.numBlock !=i :                     f = open (self.filemane, 'r')                     for linea in f:                         f.write(self.data)                     f.close()                 else:                     self.dup += 1             self.numBlock = numBlock             numBlock += 1             ack_encode(numBlock)         elif opcode == 5:             (self.opcode, self.errCode, self.errMsg, self.errMsgs) = err_decode(self)             print(self.errMsgs)  def solicitud_WRQ(self):     self.opcode = 2     self.mode = self.mode.encode('ascii')      print('Por favor introduzca el nombre del archivo.\n')     self.filename = str(input("TFTP@UDP > "))     self.filename = self.filename.encode('ascii')      frmt = b"!H"     frmt += b"%dsx" % len(self.filename)     frmt += b"5sx"      datagrama = struct.pack(frmt, self.opcode, self.filename, self.mode)     self.sock.sendto(datagrama, """server""")     return self.filename  def ack_encode(*argv): #quitar esto para TCP     self.opcode = 4     for arg in argv:         self.buffer = struct.pack(str("!HH"), self.opcode, self.numBlock)     return self.buffer  def ack_decode(self):#quitar esto para TCP     self.opcode = 4     self.numBlock = 0     if len(self.buffer)>4:         self.buffer = self.buffer[0:4]         self.opcode, self.numBlock = struct.unpack(str("!HH"), self.buffer)      return self  def data_decode(self):     self.opcode = 3     self.data = None     (self.numBock) = struct.unpack(str("!H"), self.buffer[2:4])     self.data = self.buffer[4:]     return self  def err_decode(self):     self.opcode = 5     self.errCode = 0     self.errMsg = None     self.errMsgs = {         1: b"Archivo no encontrado.",         2: b"Violacion de acceso.",         3: b"Disco lleno o asignacion superada.",         4: b"Operacion TFTP ilegal.",         5: b"ID de transferencia desconocida.",         6: b"El archivo ya existe.",         7: b"No hay tal usuario"     }     longBuf = len(self.buffer)     if longBuf == 4:          frmt = b"!HH"         self.opcode,self.errCode = struct.unpack(frmt, self.buffer)     else:          frmt = b"!HH%dsx" % (len(self.buffer)-5)         self.opcode, self.errCode, self.errMsg = struct.unpack(frmt, self.buffer)     return self 

Sé que tendré muchos fallos, asi que me disculpo. Todavía tengo que modificar algunas cosas, pero si no arreglo esto no creo que pueda ejecutarlo.

Siento las molestias, muchas gracias.