2012-01-10 13 views
7

tengo el siguiente código, que tiene los dos problemas siguientes:principal método en Python

Traceback (most recent call last): 
    File "C:\Users\v\workspace\first\src\tests.py", line 1, in <module> 
    class Animal: 
    File "C:\Users\v\workspace\first\src\tests.py", line 39, in Animal 

    File "C:\Users\v\workspace\first\src\tests.py", line 31, in main 
    dog = Animal() 
NameError: global name 'Animal' is not defined 

Este código es de un tutorial, y en el tutorial que trabaja muy bien. Tengo el Python 2.7 y uso el complemento PyDev para Eclipse.

class Animal: 
    __hungry = "yes" 
    __name = "no name" 
    __owner = "no owner" 

    def __init__(self): 
     pass 

    def set_owner(self,newOwner): 
     self.__owner= newOwner 
     return 

    def get_owner(self): 
     return self.__owner 

    def set_name(self,newName): 
     self.__name= newName 
     return 

    def get_name(self): 
     return self.__name 

    def noise(self): 
     print('errr') 
     return 

    def __hiddenmethod(self): 
     print("hard to find") 


    def main(): 
     dog = Animal()  
     dog.set_owner('Sue') 
     print dog.get_owner() 
     dog.noise() 


    if __name__ =='__main__':main() 
+7

¿Puede proporcionar un enlace a ese tutorial? Quienquiera que lo haya escrito debe recibir un disparo, o al menos debe dejar de escribir. Esa es * no * la forma de escribir las propiedades de la clase en Python. –

+2

Escucha a Daniel y busca el decorador '@ property' en Python. No tiene que escribir getters y setters así. – katrielalex

+0

Además, no utilice nombres de subrayado doble; están ahí para un caso de uso muy particular. Si desea indicar que una propiedad es "solo para uso interno", utilice en su lugar subrayado único. – katrielalex

Respuesta

33

este código:

def main(): 
    dog = Animal()  
    dog.set_owner('Sue') 
    print dog.get_owner() 
    dog.noise() 


if __name__ =='__main__':main() 

no debería estar en la clase. Cuando lo saque afuera (sin sangría) debería funcionar.

Así que después de tomar en cuenta que debe tener este aspecto:

class Animal: 
    __hungry = "yes" 
    __name = "no name" 
    __owner = "no owner" 

    def __init__(self): 
     pass 

    def set_owner(self,newOwner): 
     self.__owner= newOwner 
     return 

    def get_owner(self): 
     return self.__owner 

    def set_name(self,newName): 
     self.__name= newName 
     return 

    def get_name(self): 
     return self.__name 

    def noise(self): 
     print('errr') 
     return 

    def __hiddenmethod(self): 
     print("hard to find") 


def main(): 
    dog = Animal()  
    dog.set_owner('Sue') 
    print dog.get_owner() 
    dog.noise() 


if __name__ =='__main__': 
    main() 
1

mover tanto el método main() y la if __name__ == '__main__' declaración fuera del ámbito de la clase. Recuerde: el espacio en blanco cuenta.

+3

Programando como Guido lo sancionó, por así decirlo. – grifaton

1

Su sangría está desactivada. Recuerde que en Python, la sangría cuenta. Pruebe:

class Animal: 
    __hungry = "yes" 
    __name = "no name" 
    __owner = "no owner" 

    def __init__(self): 
     pass 

    def set_owner(self,newOwner): 
     self.__owner= newOwner 
     return 

    def get_owner(self): 
     return self.__owner 

    def set_name(self,newName): 
     self.__name= newName 
     return 

    def get_name(self): 
     return self.__name 

    def noise(self): 
     print('errr') 
     return 

    def __hiddenmethod(self): 
     print("hard to find") 

def main(): 
    dog = Animal()  
    dog.set_owner('Sue') 
    print dog.get_owner() 
    dog.noise() 


if __name__ =='__main__':main() 
2

La siguiente construcción vale la pena tener en la mayoría de su código, especialmente si se está ejecutando en múltiples entornos.

if __name__ =='__main__': 
    main() 
0

La función principal que ha definido parece que está dentro de la clase de animal. Main debe ser una función (las clases contienen métodos) fuera de la clase animal. Usted también debe tener su clase Animal heredan de objetos es decir

clase Animal (objeto):

22

Para comprender qué lo que escribió fallado, lo que necesita saber un poco acerca de cómo las definiciones de clase trabajan en Python. Como sabrá, Python es un lenguaje interpretado: hay un programa que lee archivos Python y los ejecuta a medida que avanza. Cuando el intérprete se encuentra con una definición de clase, se hace lo siguiente:

  1. Crea un nuevo espacio de nombres (registro de todos los nombres de las variables) en el que se almacenarán las variables y métodos de la clase.
  2. Extrae todo el código dentro de la definición de clase (según lo determinado por su sangría) y ejecuta ese código. Esto rellenará el espacio de nombres que acaba de crear.
  3. Crea un nuevo objeto de clase cuyo espacio de nombres es el dado anteriormente, y con las clases base que se dan en la definición.
  4. Vincula el nombre de la clase a este objeto.

¿Qué pasó cuando sangraste la función main dentro de tu código? Mientras estaba dentro del paso 2, se refirió al nombre Animal. ¡Pero este nombre no está definido hasta el paso 4! De hecho, no puede definirse en la etapa en que lo mencionó, porque sería circular. Cuando mueve main fuera de la definición de la clase, no se ejecutará hasta que se hayan completado los pasos 1 a 4, y por lo tanto, el nombre Animal ya estará vinculado.


Por cierto, el código que ha escrito no es bueno Python. Probablemente deberías tratar de encontrar un mejor tutorial; la recomendación habitual es "Inmersión en Python". Lo he reescrito como debe hacerse:

class Animal(object): 
    def __init__(self, hungry="yes", name=None, owner=None): 
      self.hungry = hungry 
      self.name = name 
      self.owner = owner 

    def noise(self): 
        print('errr') 

    def _internal_method(self): 
        print("hard to find") 

    if  __name__ =='__main__': 
      dog = Animal()     
      dog.owner = 'Sue' 
      print dog.owner 
      dog.noise() 
+3

+1 - Información muy útil para la persona que quiere aprender por qué las cosas no funcionan. – istruble

Cuestiones relacionadas