Inicio
Buscar
Ingresar
Registrarse
Starfield: el juego que revolucionará el espacio y la tecnología
Hack x Crack - Comunidad de Seguridad informática
»
Programación
»
Scripting
»
Python
»
Duda con POO en python
Imprimir
Páginas: [
1
]
Ir Abajo
Autor
Tema: Duda con POO en python (Leído 4232 veces)
xxx_jack_xxx
{ L0 } Ñuub
Mensajes: 41
Duda con POO en python
«
en:
Julio 05, 2014, 05:18:45 am »
Bueno la verdad tengo problemas para entender este paradigma de la programación. Estudiando de un libro que encontre en la web, encontre el siguiente código, y me gustaria hacer unas consultas, para saber si voy bien.
Lo que entiendo yo es que una clase es un objeto "padre" de todos los objetos, a este objeto en particular se lo llama clase, cada clase a su vez se compone de distintos objetos, los cuales tienen parámetros que los definen, y a su vez estos pueden tener métodos, los cuales son las acciones que pueden realizar los elementos de una clase. Esto como teória, aunque me gustaria ampliarla.¿Algúna recomendación?
Con respecto al código es el siguiente. Lo siguiente resuelve la distancia entre dos puntos (x,y) de el plano
Código: Python
from
math
import
sqrt
class
Point
(
object
)
:
def
__init__
(
self
,
x
=
0
,
y
=
0
)
:
if
isNumber
(
x
)
and
isNumber
(
y
)
:
self
.
x
=
x
self
.
y
=
y
else
:
TypeError
def
__str__
(
self
)
:
return
str
(
(
self
.
x
,
self
.
y
)
)
def
dist
(
self
,
z
=
0
)
:
self
.
x
=
x
self
.
y
=
y
return
sqrt
(
(
self
.
x
-z
[
0
]
)
**
2
+
(
self
.
y
-z
[
1
]
)
**
2
)
def
isNumber
(
value
)
:
return
type
(
value
)
in
[
int
,
float
,
long
]
def
leerDato
(
s
)
:
while
True
:
try
:
return
input
(
s
)
except
:
raise
TypeError
print
"bienvenido"
x
=
leerDato
(
"Coordenada x de un punto "
)
y
=
leerDato
(
"Coordenada y de un punto: "
)
p
=
Point
(
x
,
y
)
print
'('
,
p.
x
,
p.
y
,
")"
x1
=
leerDato
(
"Coordenada x1 de un punto: "
)
y1
=
leerDato
(
"Coordenada y1 de un punto: "
)
cor
=
(
x1
,
y1
)
h
=
p.
dist
(
cor
)
print
h
print
p.
__str__
(
)
Pero si lo hago de la siguiente manera:
Código: Python
from
math
import
sqrt
class
Point
(
object
)
:
def
__init__
(
self
,
x
=
0
,
y
=
0
)
:
if
isNumber
(
x
)
and
isNumber
(
y
)
:
self
.
x
=
x
self
.
y
=
y
else
:
TypeError
def
__str__
(
self
)
:
return
str
(
(
self
.
x
,
self
.
y
)
)
def
dist
(
self
,
z
)
:
self
.
x
=
x
self
.
y
=
y
return
sqrt
(
(
self
.
x
-z
[
0
]
)
**
2
+
(
self
.
y
-z
[
1
]
)
**
2
)
def
isNumber
(
value
)
:
return
type
(
value
)
in
[
int
,
float
,
long
]
def
leerDato
(
s
)
:
while
True
:
try
:
return
input
(
s
)
except
:
raise
TypeError
print
"bienvenido"
p
=
Point
(
4
,
3
)
print
'('
,
p.
x
,
p.
y
,
")"
p1
=
Point
(
8
,
3
)
d
=
(
0
,
0
)
h
=
p1.
dist
(
d
)
print
"la distancia es"
,
h
print
p.
__str__
(
)
Da error en la función dist(mejor dicho el metodo perteneciente a la clase Point), es como si no reconociera
"self.x=x"
"self.y=y"
Es como que si deben estar definidas dentro de el programa. Lo unico que me da de pensar es que al crear dos objetos (p1 y p2) como si no supiera a que asignarle self.x y self.y
¿Mi deducción es correcta o es un invento que me parece a mi ?
La verdad es que pregunto por aqui porque no encuentro la respuesta concreta a este problema
Muchas gracias a todos/as por sus respuestas
___
edited
___
seleccion de codigo - PYTHON
«
Última modificación: Julio 08, 2014, 05:16:24 pm por b10s_0v3rr1d3
»
En línea
ruben_linux
{ L3 } Über
Mensajes: 250
Re:Duda con POO en python
«
Respuesta #1 en:
Julio 05, 2014, 07:00:41 am »
yo no tengo mucha idea, pero lo que veo es que "dist" pertenece a la clase "Point". tu le das el valor "Point(8,3)" a la variable "p1" que despues usas en "h".
pero creo que esa no es la forma correcta.
h=Point.dist()
pienso que seria correcto.
En línea
http://arealinux.blogspot.com/
http://www.youtube.com/user/rubenlinux?blend=1&ob=video-mustangbase
Once
{ L2 } Nativo Digital
Mensajes: 119
Re:Duda con POO en python
«
Respuesta #2 en:
Julio 05, 2014, 07:46:32 am »
Hola brother, la POO al comienzo puede ser un poco complicada al comienzo, así que trataré de explicarte:
En Python todo son objetos (los objetos los defines mediante la palabra reservada class). Las clases pueden tener tanto atributos como métodos. Piensa en los atributos como las caracteristicas que tiene la clase o las variables, en el caso del code que posteaste los atributos serian x, y. Y piensa en los métodos como lo que puede hacer la clase (funciones) en el caso del código que publicaste, los métodos serían leerDato o isNumber, etc.
Ahora, las clases pueden heredar de otras clases (una clase pasa sus métodos y atributos a otra clase) mira este ejemplo:
Código: Python
class
Hola
(
object
)
:
saludo
=
"Hola"
def
saludar
(
self
)
:
print
self
.
saludo
class
Nada
(
Hola
)
:
def
__init__
(
self
)
:
self
.
saludar
(
)
a
=
Nada
(
)
print
a.
saludo
La clase Nada hereda de Hola y ahora Nada pasa a tener los métodos y los atributos definidos en la clase Hola.
Recuerda que los atributos se los "das" a la clase con self.atributo y puedes acceder a el desde cualquier parte de la clase e incluso desde fuera de ella
Ahora, tienes dos errores en el código que publicaste.
1) Llamas a la clase Point y le pasas los parametros x, y variables que NO están definidas (ese es el error principal)
2) En el método dist cuando haces
self.x=x self.y=y
x, y no están definidas en ninguna parte de la función dist y tampoco están definidas en ninguna parte de la clase. Si lo que pretendias es darle a self.x y self.y los valores que pasaste cuando llamaste a la clase, recuerda que ya los asignaste en el __init__ y puedes acceder a ellos desde cualquier otra función dentro de la clase.
Saludos!
___
edited
___
seleccion de codigo - PYTHON
«
Última modificación: Julio 08, 2014, 05:15:27 pm por b10s_0v3rr1d3
»
En línea
xxx_jack_xxx
{ L0 } Ñuub
Mensajes: 41
Re:Duda con POO en python
«
Respuesta #3 en:
Julio 05, 2014, 09:02:33 pm »
Ahi cambie el código, como lo habia probado,lo escribi mal xD, o sea, x e y deben estar definidas dentro de la clase o fuera de ella, vendrian a ser variables globales, como se llaman en otros lenguajes(la verdad no se si existe esto en python).
Muchas gracias por sus respuestas
En línea
$francisco
{ L6 } Flooder del foro
Mensajes: 781
Re:Duda con POO en python
«
Respuesta #4 en:
Julio 07, 2014, 12:25:28 am »
el problema es que x,y no lo reconoce, si te fijas pones self.x = x y self.y = y pero la clase dice ¿donde esta x e y? x e y pierde su valor fuera de la función y el objeto solo reconoce atributos de la clase, y la variable x e y solo seria reconocida en la funcion constructiva __init__ que es donde se define y se pasa a ser self.x para poder manejarla a traves de todo el objeto.
«
Última modificación: Julio 07, 2014, 12:30:38 am por $francisco
»
En línea
xxx_jack_xxx
{ L0 } Ñuub
Mensajes: 41
Re:Duda con POO en python
«
Respuesta #5 en:
Julio 07, 2014, 05:44:12 am »
perdon pero sigo liando con esto, cambie el código, y cree esto, pero cuando hago el metodo para el objeto p2, self.x=x y self.y=y cambia su valor al que esta dentro de la funcion "principal" o por asi decirlo, la que se ejecuta(la verdad no se como se llama, aqui el codigo). En este caso, x e y serian variables globales, o yo estoy loco, me canse de depurarlo y la verdad no le encuentro lógica
. Solo para parafrasear, cuando hago:
h1=p2.dist(cor) calcula la distancia de el punto puesto a lo primero al punto x1,y1
Código: Python
from
math
import
sqrt
class
Point
(
object
)
:
def
__init__
(
self
,
x
=
0
,
y
=
0
)
:
if
isNumber
(
x
)
and
isNumber
(
y
)
:
self
.
x
=
x
self
.
y
=
y
else
:
TypeError
def
__str__
(
self
)
:
return
str
(
(
self
.
x
,
self
.
y
)
)
def
dist
(
self
,
z
=
0
)
:
self
.
x
=
x
self
.
y
=
y
return
sqrt
(
(
self
.
x
-z
[
0
]
)
**
2
+
(
self
.
y
-z
[
1
]
)
**
2
)
def
isNumber
(
value
)
:
return
type
(
value
)
in
[
int
,
float
,
long
]
def
leerDato
(
s
)
:
while
True
:
try
:
return
input
(
s
)
except
:
raise
TypeError
print
"bienvenido"
while
True
:
try
:
x
=
leerDato
(
"Coordenada x de un punto, *, para terminar: "
)
if
x
==
"*"
:
break
y
=
leerDato
(
"Coordenada y de un punto: "
)
p
=
Point
(
x
,
y
)
print
'('
,
p.
x
,
p.
y
,
")"
p2
=
Point
(
8
,
6
)
x1
=
leerDato
(
"Coordenada x1 de un punto: "
)
y1
=
leerDato
(
"Coordenada y1 de un punto: "
)
cor
=
(
x1
,
y1
)
h
=
p.
dist
(
cor
)
h1
=
p2.
dist
(
cor
)
print
h
print
h1
print
p.
__str__
(
)
print
p.
__str__
(
)
except
TypeError
:
print
x
,
y
,
"no validas"
Gracias por sus respuestas y paciencia
___
edited
___
seleccion de codigo - PYTHON
«
Última modificación: Julio 08, 2014, 05:14:37 pm por b10s_0v3rr1d3
»
En línea
Once
{ L2 } Nativo Digital
Mensajes: 119
Re:Duda con POO en python
«
Respuesta #6 en:
Julio 07, 2014, 11:34:42 pm »
Estas algo confundido bro.
Cuando llamas a la clase con Point(1, 2) en realidad Python construye la clase y llama al método __init__ al que le pasa los parametros con que llamaste a la clase, en este caso 1, 2.
En el método __init__ estas recibiendo los parametros con las variables x e y. Pero esas variables sólo son visibles desde ese método, una vez fuera del método __init__ x e y no están definidas.
En las clases cambias las variables globales por los atributos de clase (que son "visibles" en TODA la clase e incluso fuera de ella). cuando haces un self.variable estas definiendo un atributo de clase, por lo tanto puedes acceder a self.variable desde toda la clase.
El error lo tienes en el método
dist
que sólo recibe como parametro a la variable z, pero intentas asignar a self.x y a self.y las variables x, y
que no están definidas para ese método
. recuerda que self.x y self.y las defines en el método __init__ cuando compruebas que x, y son números.
Mira así:
Código: Python
from
math
import
sqrt
class
Point
(
object
)
:
def
__init__
(
self
,
x
=
0
,
y
=
0
)
:
if
isNumber
(
x
)
and
isNumber
(
y
)
:
self
.
x
=
x
self
.
y
=
y
else
:
TypeError
def
__str__
(
self
)
:
return
str
(
(
self
.
x
,
self
.
y
)
)
def
dist
(
self
,
z
=
0
)
:
return
sqrt
(
(
self
.
x
-z
[
0
]
)
**
2
+
(
self
.
y
-z
[
1
]
)
**
2
)
def
isNumber
(
value
)
:
return
type
(
value
)
in
[
int
,
float
,
long
]
punto
=
Point
(
1
,
1
)
print
punto.
dist
(
(
0
,
0
)
)
Saludos!
En línea
xxx_jack_xxx
{ L0 } Ñuub
Mensajes: 41
Re:Duda con POO en python
«
Respuesta #7 en:
Julio 08, 2014, 06:01:54 am »
Perdon, pero de verdad que no lo veo :s
O sea, todas la variables que estan adentro de While True: ¿son gloabales y son accesibles por el metodo dist de p2 y de p ?
Por que yo lo estoy haciendo un debug con Pydev y cuando hago ingreso x, ingreso y con algún valor, este se guarda en la variable x e y respectivamente. Por ejemplo supongamos que ingreso x=4, y=3, y1=x1=0
Calcula la distancia correctamente al punto x1 e y1. Luego he puesto para probar el punto (8,6) al objeto p2. Luego hago
h=p.dist(cor) siendo cor=(x1,y1)
Luego consulta al metodo y retorna la distancia correctamente, pero cuando hago
h1=p2.dist(cor)
La sentencia self.x=x y self.y asigna los valores x e y ingresados a lo primero, en este caso las variables quedan con los valores
self.x=4
self.y=3
Y h1 es la distancia del primer punto (4,3) al cor. Entiendo que x e y del método __init__ son distintos al x,y de la sentencia While True:
Entonces¿ todas las variables dentro de While True son globales?
Gracias por su paciencia ! ! ! !
En línea
Once
{ L2 } Nativo Digital
Mensajes: 119
Re:Duda con POO en python
«
Respuesta #8 en:
Julio 08, 2014, 06:45:59 am »
De cierta manera sí son globales, cuando el método dist no encuentra las variables x, y definidas, las va a intentar buscar fuera de la clase, si no las encuentra, lanza un error, pero si las encuentra, va a usar esos valores.
Lo que no entiendo es por qué si le pasas al método __init__ las coordenadas y las almacenas como atributos en la clase (self.x y self.y) intentas asignarle de nuevo a los éstos atributos x, y que no stán definidas en el método dist.
Haz una prueba, cambia en el método dist self.x=x por print self.x y self.y=y por print self.y para que veas que los atributos ya están definidos y el valor que tienen.
Si eliminas esas asignaciones, p.dist() y p2.dist() sólo van a trabajar con las cordenadas con las que se instancio la clase
Saludos!
En línea
xxx_jack_xxx
{ L0 } Ñuub
Mensajes: 41
Re:Duda con POO en python
«
Respuesta #9 en:
Julio 08, 2014, 08:19:39 am »
Tenes razón, Lo sospeche desde el principio diria mi amigo el chapulin que me acompaña a la noche en la tv xD. Fuera de broma, lo puse asi porque el codigo en el libro que encontre estaba asi, luego lo fui modificando y depurando con pydev para como se dice aca "boludear" y probar distintas cosas que no tenia en claro, pero gracias ahora entendi lo que pasa, lo que sucede (al menos yo lo entiendo asi), al no encontrar la variable x e y definidas, la va buscar al programa y por eso es que cambia los valores, de hecho, si hago la asignacion al reves, es decir
x=self.x
y=self.y
no hay error por que la asignacion de valores es al reves, ahi no tira problema
Muchas gracias a todos por sus respuestas
Asique Vamos clarando el panorama ♪..
En línea
Imprimir
Páginas: [
1
]
Ir Arriba
Hack x Crack - Comunidad de Seguridad informática
»
Programación
»
Scripting
»
Python
»
Duda con POO en python
Va un mudo y le dice a un sordo: Hack x Crack usa cookies. Pues eso...
OK
Learn more