Foros del Web » Programando para Internet » Python »

comenzando con python

Estas en el tema de comenzando con python en el foro de Python en Foros del Web. hola a todos tengo ganas de aprender python y he decido empezar siguiendo la guía "python para todos" de raul gonzalez duque. uso windows y ...
  #1 (permalink)  
Antiguo 04/10/2009, 10:49
Avatar de navarone86  
Fecha de Ingreso: octubre-2009
Mensajes: 62
Antigüedad: 15 años, 2 meses
Puntos: 2
comenzando con python

hola a todos

tengo ganas de aprender python y he decido empezar siguiendo la guía "python para todos" de raul gonzalez duque. uso windows y he instalado python 3.1.1.

sigo todos los pasos de la guia, pero me casca el "hola mundo" y no tengo ni idea de porque puede ser. he buscado por internet pero no encuentro nada. he probado a añadir a la variable path la ruta de la carpeta donde esta instalado python, pero ni con esas (es lo único que se me ha ocurrido)

el código que introduzco es el siguiente:

Código:
print "Hola Mundo"
y el mensaje que me devuelve la consola es el siguiente:

Código:
SyntaxError: invalid syntax (<pyshell#0>, line 1)
todo esto en la consola interactiva que se instala al instalar python

me frustra muchísimo tener estos problemas antes de empezar, pero bueno, aun tengo ganas de aprender ;)

espero que podáis ayudarme

un saludo y gracias de antemano

Última edición por navarone86; 04/10/2009 a las 11:07
  #2 (permalink)  
Antiguo 04/10/2009, 12:27
Avatar de navarone86  
Fecha de Ingreso: octubre-2009
Mensajes: 62
Antigüedad: 15 años, 2 meses
Puntos: 2
Respuesta: comenzando con python

bueno, parece que ya he dado con el origen del problema

si uso python 3.1.1 hay que poner:

Código:
print("Hola mundo")
y si se utiliza python 2.6.3, es el codigo de antes:

Código:
print "hola mundo"

supongo que toda la guia que estoy siguiendo estara escrita para python 2.6

ahora mi pregunta es la siguiente, que me conviene mas, meterme con la versión 3.1.1 para ir conociendo todos estos pequeños cambios, o utilizar la 2.6 para evitar este tipo de problemas ??


un saludo
  #3 (permalink)  
Antiguo 04/10/2009, 13:20
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 9 meses
Puntos: 1360
Respuesta: comenzando con python

Te recomiendo que domines al 100% python 2.6 y luego pasarte a python 3.x

Lo digo por que por ahora hay mas módulos para python 2.6 que para python 3.x

Si bien hay varios cambios de python 2.6 a 3.x, también puedes utilizar el script 2to3 que trae integrado python 3.x para pasar tus programas de python 2.6 a 3.x
  #4 (permalink)  
Antiguo 04/10/2009, 13:33
Avatar de navarone86  
Fecha de Ingreso: octubre-2009
Mensajes: 62
Antigüedad: 15 años, 2 meses
Puntos: 2
Respuesta: comenzando con python

vale, muchas gracias. te haré caso y me quedare con la versión 2.6

gracias de nuevo
  #5 (permalink)  
Antiguo 13/10/2009, 14:45
Avatar de navarone86  
Fecha de Ingreso: octubre-2009
Mensajes: 62
Antigüedad: 15 años, 2 meses
Puntos: 2
Respuesta: comenzando con python

bueno, refloto el hilo con otra duda, esta vez sobre la encapsulación

si tengo la clase Persona:

Código:
class Persona():
	def __init__(self):
		self.__nombre = ""
		self.__apellido = ""
		self.__dni = ""

	def getNombre(self):
		return self.__nombre
		
	def setNombre(self, n):
		self.__nombre = n
	
	def getApellido(self):
		return self.__apellido
		
	def setApellido(self, a):
		self.__apellido = a
		
	def getDni(self):
		return self.__nombre
		
	def setDni(self, d):
		self.__dni = d
		
	nombre = property(getNombre, setNombre)
	apellido = property(getApellido, setApellido)
	dni = property(getDni, setDni)
y luego otro fichero con un main tal que:

Código:
from Persona import Persona

print "Hola mundo"

p= Persona()
p.nombre = "fulanito"
print p.nombre
raw_input()

lo que yo entendía, es que al ser los atributos de Persona privados, había que usar los getters y setters para acceder a ellos. y que poniendo las lineas:

Código:
nombre = property(getNombre, setNombre)
apellido = property(getApellido, setApellido)
dni = property(getDni, setDni)
le estábamos diciendo a python que use esos métodos para manipular esos atributos cuando acceda mediante p.nombre, sin tener que poner p.setNombre(). pero he estado haciendo pruebas, y si comento estas 3 lineas, sigo pudiendo modificar el nombre sin tener que usar setNombre()

podéis echarme un cable con esto? que ya veis que estoy un poco liado

un saludo
  #6 (permalink)  
Antiguo 14/10/2009, 08:28
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 9 meses
Puntos: 1360
Respuesta: comenzando con python

1.- El ejemplo de arriba le falta heredar de clase object, para que funcione lo de los setters y getters.
2.- A los objetos en python le puedes ir agregando propiedades.
Ejemplo simple:
Código python:
Ver original
  1. class Objeto():
  2.     def __init__(self):
  3.         pass
  4.  
  5. obj = Objeto()
  6. obj.x = 0
  7. print obj.x

Solo para que veas la diferencia que hay:
Código python:
Ver original
  1. class Persona(object):
  2.     def __init__(self):
  3.         self.__nombre = ""
  4.         self.__apellido = ""
  5.         self.__dni = ""
  6.  
  7.     def getNombre(self):
  8.         return self.__nombre
  9.        
  10.     def setNombre(self, n):
  11.         self.__nombre = n
  12.    
  13.     def getApellido(self):
  14.         return self.__apellido
  15.        
  16.     def setApellido(self, a):
  17.         self.__apellido = a
  18.        
  19.     def getDni(self):
  20.         return self.__nombre
  21.        
  22.     def setDni(self, d):
  23.         self.__dni = d
  24.        
  25.     nombre = property(getNombre, setNombre)
  26.     apellido = property(getApellido, setApellido)
  27.     dni = property(getDni, setDni)
  28.  
  29. p = Persona()
  30. p.nombre = "fulanito"
  31. print p.nombre
  32. print p.getNombre()
Si le quitas la herencia veras, imprimira fulanito y después una linea en blanco.
  #7 (permalink)  
Antiguo 15/10/2009, 05:48
Avatar de navarone86  
Fecha de Ingreso: octubre-2009
Mensajes: 62
Antigüedad: 15 años, 2 meses
Puntos: 2
Respuesta: comenzando con python

vale, muchas gracias, no sabia que era necesario heredar de object

una cosa mas, puede una clase en python tener 2 constructores (con parámetros y sin parámetros) ?? y en caso de que no se pueda, cual de los 2 es mas recomendable usar y por que ?? por internet solo encuentro ejemplos con un solo constructor, por eso pienso que igual solo pueden tener uno. y de esos ejemplos que he encontrado, algunos tienen constructor con parámetros y otros sin parámetros, a partes iguales

y dentro de los constructores, se pueden usar los métodos get y set, o hay que asignar los valores mediante: clase.atributo = xxx

un saludo
  #8 (permalink)  
Antiguo 15/10/2009, 11:14
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 9 meses
Puntos: 1360
Respuesta: comenzando con python

Te refieres a lo de la java que sobre carga el constructor de una clase haciendo varios constructores, que vayan con y sin parámetros?

Bueno si es eso. En python tenemos algo llamado parámetros opcionales.

Te pondre un ejemplo:
Código python:
Ver original
  1. def funcion(parm1 = 'a', parm2 = 'b')
  2.     print "Parametro1: %s" % param1
  3.     print "Parametro2: %s" % param2
  4.  
  5. funcion() #1
  6. funcion(1) #2
  7. funcion(2, 3) #3
1.- Imprimiría:
Código:
a
b
2.- Imprimiría:
Código:
1
b
3.- Imprimiría:
Código:
2
3
  #9 (permalink)  
Antiguo 15/10/2009, 12:58
Avatar de navarone86  
Fecha de Ingreso: octubre-2009
Mensajes: 62
Antigüedad: 15 años, 2 meses
Puntos: 2
Respuesta: comenzando con python

nunca se me habría ocurrido usar así lo de los parámetros opcionales, muchas gracias de nuevo

sigo teniendo problemas para hacer esta clase de prueba, y me temo que son porque estoy demasiado acostumbrado a java

la clase esta así:

Código:
class Persona(object):
	"""Clase Persona"""
		
	def __init__(self, nombre="", apellido="", dni=""):
		"""Constructor"""
#		self.setNombre(nombre)
#		self.setApellido(apellido)
#		self.setDni(dni)
		self.__nombre = nombre
		self.__apellido = apellido
		self.__dni = dni

	def getNombre(self):
		return self.__nombre
		
	def setNombre(self, n):
		self.__nombre = n
	
	def getApellido(self):
		return self.__apellido
		
	def setApellido(self, a):
		self.__apellido = a
		
	def getDni(self):
		return self.__nombre
		
	def setDni(self, d):
		self.__dni = d
		
	__nombre = property(getNombre, setNombre)
	__apellido = property(getApellido, setApellido)
	__dni = property(getDni, setDni)
cuando trato de crear un objeto de la clase Persona, me sale el siguiente error:

Código:
Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    fulanito= Persona()
  File "<pyshell#5>", line 9, in __init__
    self.__nombre = nombre
  File "<pyshell#5>", line 17, in setNombre
    self.__nombre = n
  File "<pyshell#5>", line 17, in setNombre
    self.__nombre = n
...
...
que es lo que hago mal ??


y lo de antes: no se pueden usar dentro del constructor los setters, no ? en un ejemplo de internet lo vi así, y me pareció que quedaba mas elegante el código, pero probando me cascaba siempre, así que por eso creo que no se puede, pero no lo se seguro.


1 saludo
  #10 (permalink)  
Antiguo 15/10/2009, 20:44
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 9 meses
Puntos: 1360
Respuesta: comenzando con python

El error esta aquí:
Código python:
Ver original
  1. __nombre = property(getNombre, setNombre)
  2.     __apellido = property(getApellido, setApellido)
  3.     __dni = property(getDni, setDni)
Lo que pasa es que empieza a hacerse recursivo. Por que __nombre ya es una función dentro de la clase.

Si estas al nivel de la clase te darás cuenta que no necesitas usar self, pero cuando estas haciendo un método de la clase. Es necesario usar el self.

Cuando deberia de ser:
Código python:
Ver original
  1. nombre = property(getNombre, setNombre)
  2.     apellido = property(getApellido, setApellido)
  3.     dni = property(getDni, setDni)

Desintoxícate de Java leyendo un rato:
python para todos o dive into python.

Y claro sigue posteando tus dudas.

Para ser sincero usaría "property" para cuando tenga que hacer procedimientos para obtener o ajustar algo.

Un ejemplo seria una clase empleado, donde dependiendo de lo que tengas en la variable puesto calcules el sueldo que es una propiedad privada. Al ajustar el puesto automáticamente cambias el sueldo. Para no estar calculando el sueldo cada vez que lo pidas.

Pero en esta clase Persona, seria perfectamente normal lo siguiente.
Código python:
Ver original
  1. class Persona(object):
  2.     """Clase Persona"""
  3.     def __init__(self, nombre="", apellido="", dni=""):
  4.         """Constructor"""
  5.         self.nombre = nombre
  6.         self.apellido = apellido
  7.         self.dni = dni

En resumen usa solo property para cuando tengas que hacer operaciones extras.
O para hacer variables que solo se puedan asignar pero no obtener.
O variables que se puedan obtener pero no asignar.
  #11 (permalink)  
Antiguo 18/10/2009, 11:56
Avatar de navarone86  
Fecha de Ingreso: octubre-2009
Mensajes: 62
Antigüedad: 15 años, 2 meses
Puntos: 2
Respuesta: comenzando con python

muchas gracias por estas explicaciones tan extensas.

la guia que estoy siguiendo para aprender es la que has citado tu, "python para todos", pero esto no me acaba de quedar claro

lo que pretendo es crear una clase en la que para acceder a sus atributos (ya sea asignar u obtener), solo pueda hacerse mediante los getters y setters. pero parece ser que no se puede, no ?

no acabo de entender para que sirve la sentencia "property", porque en el ejemplo de la guía, después de definir los getters y setters, y la sentencia property correspondiente, siguen accediendo a los atributos mediante clase.atributo

copio aquí el ejemplo de la guia:

Código:
class Fecha(object):
def __init__(self):
self.__dia = 1
def getDia(self):
return self.__dia
def setDia(self, dia):
if dia > 0 and dia < 31:
self.__dia = dia
else:
print “Error”
dia = property(getDia, setDia)
mi_fecha = Fecha()
mi_fecha.dia = 33
un saludo

PD: como se hace para poner código python en las etiquetas, y no código genérico ??
  #12 (permalink)  
Antiguo 18/10/2009, 13:04
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 9 meses
Puntos: 1360
Respuesta: comenzando con python

Cita:
Iniciado por navarone86
lo que pretendo es crear una clase en la que para acceder a sus atributos (ya sea asignar u obtener), solo pueda hacerse mediante los getters y setters. pero parece ser que no se puede, no ?
Si se puede hacer, solo que no le puedes poner __ al principio del nombre del atributo.

Cita:
Iniciado por navarone86
no acabo de entender para que sirve la sentencia "property", porque en el ejemplo de la guía, después de definir los getters y setters, y la sentencia property correspondiente, siguen accediendo a los atributos mediante clase.atributo
Primero un poco de variables privadas y publicas.
Código python:
Ver original
  1. class Prueba:
  2.     def __init__(self):
  3.         self.x = 0 #Publica
  4.         self.__x = 0 #Privada
  5. obj = Prueba()
  6. obj.x #Imprimira 0
  7. obj.__x #Error, es una variable privada

Hora que ya sabemos que self.x self.__x son variables diferentes. Pasaremos a lo de property
Lo único que hace property es sobrecargar el operador = (En el caso de los setter)
Y enlazar el atributo con el método dado (En el caso de los getter)

Solo para seguir con tu ejemplo:
Código python:
Ver original
  1. class Persona(object):
  2.     """Clase Persona"""
  3.        
  4.     def __init__(self, nombre="", apellido="", dni=""):
  5.         """
  6.            Este no es el contructor, solo es el inicializador
  7.            la funcion __new__ es el contructor. Pero solo se
  8.            rara vez se define __new__ por el programador.
  9.        """
  10.         self.__nombre = nombre
  11.         self.__apellido = apellido
  12.         self.__dni = dni
  13.  
  14.     def getNombre(self):
  15.         return self.__nombre
  16.        
  17.     def setNombre(self, n):
  18.         self.__nombre = n
  19.    
  20.     def getApellido(self):
  21.         return self.__apellido
  22.        
  23.     def setApellido(self, a):
  24.         self.__apellido = a
  25.        
  26.     def getDni(self):
  27.         #return self.__nombre
  28.         #Creo que deverias retornar self.__dni
  29.         return self.__dni
  30.        
  31.     def setDni(self, d):
  32.         self.__dni = d
  33.        
  34.     #__nombre = property(getNombre, setNombre)
  35.     #__apellido = property(getApellido, setApellido)
  36.     #__dni = property(getDni, setDni)
  37.     # No pueden ir con __ al principio
  38.     nombre = property(getNombre, setNombre)
  39.     apellido = property(getApellido, setApellido)
  40.     dni = property(getDni, setDni)
  41.  
  42. persona = Persona()
  43.  
  44. persona.nombre = "Maria"
  45. persona.apellido = "La del barrio"
  46. persona.dni = "No tengo idea que vaya aqui"
  47.  
  48. print persona.nombre
  49. print persona.apellido
  50. print persona.dni

Para lo de la sintaxis lee este post
  #13 (permalink)  
Antiguo 18/10/2009, 16:01
Avatar de navarone86  
Fecha de Ingreso: octubre-2009
Mensajes: 62
Antigüedad: 15 años, 2 meses
Puntos: 2
Respuesta: comenzando con python

entonces, nosotros no usamos nunca ni los getters ni los setters, usamos directamente clase.atributo para todo, y el property es quien se encarga de llamar a los getters y setters. esto era lo que mosqueaba, porque al final estamos trabajando como si de atributos públicos se tratara, no hay ninguna manera de diferenciarlos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:57.