0

Es una aplicación para una condominio con registro para propietarios, arrendatarios y visitantes. Esta la primera opción que es de registro de las personas y el segundo de ingreso ,Pasa que en la opción 2 que es de ingreso me arroja name 'self' is not defined y es he estado intentando arreglarlo y no puedo y necesito su ayuda.

class Persona: # este es la clase para la primera opcion
    def __init__ (self, Rut, PNombre, SNombre, APaterno, AMaterno, CAcceso):

    self.Rut = Rut
    self.PNombre = PNombre
    self.SNombre = SNombre
    self.APaterno = APaterno
    self.AMaterno = AMaterno
    self.CAcceso = CAcceso

def MostrarInfo(self):# en esta se encuentra self
    
    return '{} {} {} {} {} {}'.format(self.Rut,self.PNombre,self.SNombre,self.APaterno,self.AMaterno,self.CAcceso)

                                                  
def Persona_1(): #opcion 1 sirve para registrarse 
    print("Ingrese los siguientes datos")

Rut = str(input("Ingrese su rut: "))
if len(Rut)> 0:
    pass
else:
    print("Intentelo de nuevo")
    return False
    
PNombre = input("Ingrese su nombre: ")
if len(PNombre)> 0:
    pass
else:
    print("Intentelo de nuevo")
    return False
    
SNombre = input("Ingrese su segundo nombre: ")
if len(SNombre)> 0:
    pass
else:
    print("Intentelo de nuevo")
    return False
       
APaterno = input("Ingrese su primer apellido: ")
if len(APaterno)> 0:
    pass
else:
    print("Intentelo de nuevo")
    return False
        
AMaterno = input("Ingrese su segundo apellido: ")
if len(AMaterno)> 0:
    pass
else:
    print("Intentelo de nuevo")
    return False
        
CAcceso = input("Ingrese su clave se acceso: ")
if len(CAcceso)> 0:
    pass
else:
    print("Intentelo de nuevo")
    return False
            

Answer = Persona(Rut,PNombre,SNombre,APaterno,AMaterno,CAcceso)

print(Answer.MostrarInfo())

def SolicitarAcceso(self, self.Rut, self.CAcceso):# opcion 2 # aqui esta el problema 

Rut = input("Ingrese un Rut")
CAcceso = input("Ingrese el Codigo de Acceso")

if Rut == self.Rut:
    pass
if CAcceso == self.CAcceso:
    
    if CAcceso == "CODPROP":
        print("Propietario Comprobado, Acceso Concedido")
        
    elif CAcceso == "CODARRE":
        print("Arrendatario Comprobado, Acceso concedido")
    
    elif CAcceso == "COVISIT":
        print("Visitante Comprobado, Acceso Concedido")
    else:
        return 

    

PantallaOpciones = int(input("Menu:\Ingrese el numero de la opcion requerida \n 1-Registrar Persona: \n 2-Solicitar Acceso \n 0-Salir \n "))
# Esto es el menu de opciones.
while PantallaOpciones != 0:

if PantallaOpciones == 1: # Opcion 1 
    Persona_1()

elif PantallaOpciones == 2:
    SolicitarAcceso()

else:
    print("Seleccione la opcion correcta.")

PantallaOpciones = int(input("Menu: \n 1-Registrar Persona: \n 2-Solicitar Acceso \n 0-Salir \n "))

eso les agradecería que me ayudaran gracias

BetaM
  • 30,571
  • 7
  • 32
  • 50
  • self hace referencia o apunta hacia la clase, cada método que pertenezca a la clase debe tener entre sus parámetros el objeto self, si no es un método de la clase, entonces no debe llevar dicho objeto. Y según veo, MostrarInfo si debería ser método xq accedes a los diferentes miembros de la clase, el error está en la identación. Ese método está fuera de la clase. – soyunewok Jul 01 '21 at 20:01
  • Revisa esto: https://es.stackoverflow.com/questions/90357/para-qu%c3%a9-se-utiliza-self-en-poo-en-python – Patricio Moracho Jul 01 '21 at 20:36
  • Y por otro lado, revisa la identación de tu código por que no parece correcta, hay metodos de la clase Persona que esta afuera de la clase. – Patricio Moracho Jul 01 '21 at 20:38
  • @soyunewok la palabra *self* no es mas que un estándar para hacer referencia a la propia clase. Al invocar a algún método de clase, por defecto se le pasa la misma clase (lo que vendría a ser el primer parámetro). Por ultimo recuerda que en Python no existen los punteros y cada clase creada es un nuevo objeto (tipo de dato) – Christian Jul 01 '21 at 21:09
  • @Christian internamente python no maneja punteros ? – soyunewok Jul 01 '21 at 21:31
  • @soyunewok Python está basado en C por lo que al final el que maneja definiciones de punteros es C – Christian Jul 01 '21 at 21:36
  • Es curioso, por ejemplo yo uso Self (notese la s mayuscula) y me anda igual. self es un nombre de variable que se usa por convención. También podrías usar this (como oi que usan en Java) y funcionaría igual. Self NO hace referencia a la propia clase, sino a la un objeto creado a partir de esta clase. Por ejemplo cuando llamas a un método así: persona.MostrarInfo() es equivalente a Persona.MostrarInfo(persona). Donde persona es un objeto creado a partir de la clase Persona. – Dante S. Jul 01 '21 at 21:37
  • Más allá del proposito de Self. Que esperas que respondamos? El proposito de Self? O la solución a tu error? No puedes hacer dos preguntas en una y el titulo no tiene nada que ver con el contenido de la pregunta. – Dante S. Jul 01 '21 at 21:38
  • Si lo que esperas es la solución a tu error, Patricio Moracho tiene razón, tienes que revisar la identación de tu código. Además, si esperas eso, podrías editar tu titulo a algo que esté más orientado a lo que dice la pregunta por favor? Como por ejemplo "name Self is not defined POO". – Dante S. Jul 01 '21 at 21:44
  • @DanteS. Exacto, el nombre no importa, solo que el pimer oarametro (sea cual sea el nombre que le hayas puesto) si hace referencia a la misma clase (por no decir que es la clase) – Christian Jul 01 '21 at 22:20
  • @Christian no hace referencia a la clase, si no al objeto creado a partir de esa clase. No son lo mismo. – Dante S. Jul 01 '21 at 23:27

0 Answers0