Python - Es Python tan orientado a objetos como dicen?

 
Vista:

Es Python tan orientado a objetos como dicen?

Publicado por Johan Donado (3 intervenciones) el 19/09/2018 19:51:18
Saludos.

Sus opiniones por favor.

Si Pyhton es tan orientado a objetos como dicen, por qué en lugar de usar algo como:

3.14159265359.round( 4 )

Hay que usar algo como:

round( 3.14159265359, 4 )

Es decir usar funciones en lugar de métodos del objeto, si se supone que todo es un objeto.

Es más, de hecho el número sí es un objeto, pero Python trata de esconder sus métodos teniendo que usar algo como:

3.14159265359.__round__( 4 )

En Ruby sí que se puede hacer 3.14159265359.round( 4 ). De hecho ni los paréntesis son necesarios:

3.14159265359.round 4
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Leonardo Daniel A.
Val: 95
Ha disminuido su posición en 2 puestos en Python (en relación al último mes)
Gráfica de Python

Es Python tan orientado a objetos como dicen?

Publicado por Leonardo Daniel A. (33 intervenciones) el 22/09/2018 03:22:46
Nop, Python tiene soporte para programacion orientada a objetos, como son las clases, herencia, polimorfismo, encapsulacion... pero no es un lenguaje donde todo sea un objeto, como sucede en Ruby...., de hecho C# tambien puedes hacer cosas asi como tuVariableString.Length o total.toString() , etc.


Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de kip
Val: 1.120
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Es Python tan orientado a objetos como dicen?

Publicado por kip (257 intervenciones) el 23/09/2018 02:46:52
Hola, tu pregunta es algo inconclusa porque no especificas que exactamente deseas evaluar de Python con respecto al paradigma OOP, aunque por el contenido de tu mensaje se puede deducir que es referente a la construcción del lenguaje en si y no a su implementación o uso.

Como lo menciona Leonardo, Python es multiparadigma, hablando en este caso de su implementacion y la libertad que este da al usuario, pero es incorrecto lo que dice con respecto a que no todo es un objeto, en Python todo es un objeto (como lo he dicho antes), te dejo un enlace del mailist de Python que podrás leer

Con respecto a porque round existe como función y no como un método de clase supongo que se debe a las especificaciones del lenguaje en si por parte de G.V.R, es fascinante ver el resultado y como se comportan los objetos.

Lo principal que debemos saber es que round es simplemente una función que delega su trabajo al método mágico __round__ y solo es aplicable por ende en objetos que tengas este método, tal como lo dice la documentación:

For a general Python object number, round delegates to number.__round__.
https://docs.python.org/3/library/functions.html#round

Esto no se aplica a round solamente, el comportamiento de los objetos están basados en los métodos mágicos de este, me atrevo a decir que todas las funciones como lo son str, pow o reversed y algunas keyword com 'not in' que interactuén de alguna forma con un objeto tienen la misma característica, este enlace tiene mucha mas info https://rszalski.github.io/magicmethods/

Ahora bien, como demostramos lo dicho anteriormente, es posible aplicar 'duck typing' ? Si, mira este ejemplo:

1
2
3
4
5
6
7
8
>>> class myFakeInt: pass
...
>>> myFakeInt.__round__ = lambda s, v=0: 'Works!' if not v else f'Works with {v}!'
>>> round(myFakeInt())
'Works!'
>>> round(myFakeInt(), 2)
'Works with 2!'
>>>

Otro ejemplo mas:

1
2
3
>>> myFakeInt.__add__ = lambda s, v: f'Instancia + {v}'
>>> myFakeInt() + 4
'Instancia + 4'

En el ejemplo anterior funciona solo cuando nuestro objeto precede al signo +, recuerda que la suma se hace de izq a derecha y el entero es pasado como argumento al método __add__, una cosa interesante es que al hacer una interpolación dentro del string del entero para retornar el resultado de la "suma", se accede al método mágico __str__ del entero en si, un ultimo ejemplo:

1
2
3
4
5
6
>>> class myFakeInt2: pass
...
>>> myFakeInt2.__str__ = lambda s: 'Altered str behaivor'
>>> myFakeInt() + myFakeInt2()
'Instancia + Altered str behaivor'
>>>

Te das cuenta que todo lo define el método mágico ? No existen valores primitivos !

En resumen, todo es un objeto en Python, inclusive una clase es un objeto, esto debido a la implementación de metaclases pero es un tema algo mas extenso y si tienes ganas podrías investigar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 5
Ha disminuido su posición en 21 puestos en Python (en relación al último mes)
Gráfica de Python

Es Python tan orientado a objetos como dicen?

Publicado por JOHAN (1 intervención) el 23/09/2018 05:52:18
El tema era menos complicado que todo esto que dices. Simplemente si es tan bueno con el paradigma orientado a objetos, por qué las clases básicas, como un número, no permiten el uso de métodos de una manera sencilla, como sí lo hacen con el paradigma funcional. Si existe una función round, por qué no existe un método round? Sería lo lógico. En lugar de esto ponen un método __round__.

Todo es un objeto, pero parece que no lo ponen fácil.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar