Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Herencia: Definir getter y setter en clases distintas #317

Closed
mpmunoz13 opened this issue Apr 7, 2020 · 5 comments
Closed

Herencia: Definir getter y setter en clases distintas #317

mpmunoz13 opened this issue Apr 7, 2020 · 5 comments
Assignees
Labels
contenidos Issues relacionadas con los contenidos del curso general resuelto Issues resueltas

Comments

@mpmunoz13
Copy link

mpmunoz13 commented Apr 7, 2020

Hola!
Se puede definir el getter en una clase y el setter dentro de la sub-clase? o deben ir juntos?

@igbasly igbasly self-assigned this Apr 7, 2020
@igbasly
Copy link
Member

igbasly commented Apr 7, 2020

Hola @mpmunoz13 😄
Interesante pregunta acerca de herencia y uso de properties 🤔, según lo que estuve averiguando y probando, sí se puede definir el setter en una sub-clase, habiendo definido la property en la clase padre.
Un ejemplo podría verse así:

class Clase1:
    def __init__(self):
        self.__atributo = 0
    
    @property
    def prop(self):
        print("Se ha llamado al getter")
        return self.__atributo


class Clase2(Clase1):
    def __init__(self):
        super().__init__()
    
    @Clase1.prop.setter
    def prop(self, value):
        self.__atributo = value
        print("Se ha establecido un nuevo valor:", value)

Hay que considerar que en las properties no es necesario definir getter y setter en conjunto, pude existir solo el getter. Claro, si intentas asignarle un valor al atributo, arrojará un error por la falta del método.
Además, para poder definir el setter en una sub-clase, se debe hacer llamando a la property de la clase padre directamente @Clase1.prop.setter. Esto debido a que si solo pusieras @prop.setter, Python al momento de ejecutar el código y llegue a class Clase2(Clase1): para definir todos los métodos (recuerda que Python crea los métodos antes de ser instanciada la clase) se encontrará con que no existe un atributo prop, porque viene desde la super-clase, y a nivel de programa aún no se ha concretado la herencia (esto sucede en el super().__init__() al momento de instanciar la clase). En resumen, genera un error 😅 .

Como último detalle, siempre es válido que definas toda la property de nuevo en la clase heredada (overriding), no hay problema con eso tampoco.

Por favor comenta si algo no quedó claro o si surgió alguna otra duda producto de la explicación.
Saludos ✌️

@igbasly igbasly added the general label Apr 7, 2020
@igbasly igbasly changed the title properties usando herencia Herencia: Definir getter y setter en clases distintas Apr 7, 2020
@NikiHV
Copy link

NikiHV commented Apr 8, 2020

Una pregunta, ¿sabes si usar @super().prop.setter funciona en lugar de @Clase1.prop.setter?

@mpmunoz13
Copy link
Author

Quedo clarisimo! Muchas Gracias!!

@igbasly igbasly added the contenidos Issues relacionadas con los contenidos del curso label Apr 8, 2020
@igbasly
Copy link
Member

igbasly commented Apr 8, 2020

Una pregunta, ¿sabes si usar @super().prop.setter funciona en lugar de @Clase1.prop.setter?

Hola @NikiHV ✌️
Respecto a tu pregunta, no, utilizar super() en vez de Clase1 no funciona para definir la property.
Esto se puede explicar entendiendo un poco cómo funciona super, ya que en teoría super no es la clase padre, sino que una clase intermedia que nos permite acceder a instancias temporales de las super-clases.
Por otro lado, el funcionamiento de super necesita que la clase esté definida, porque internamente el super que nosotros colocamos super(), Python lo transforma a super(ClaseActual, self) siendo ClaseActual la clase donde super está siendo utilizado.
A lo que quiero llegar, es que si pusiéramos el super al definir la property como @super().prop.setter, esto se leería durante la definición de la clase, es decir, aún no está definida, por lo tanto, Python no podría completar el super porque no puede entregarle una clase que aún no existe, lo que arroja un error 😕 .

Lo siento si me alargué un poco, pero creo que es importante entender porque algo no funciona más allá un simple "no funciona" jajajaja.
Espero haber sido claro en la explicación y hazme saber si aún hay alguna duda 😅

@NikiHV
Copy link

NikiHV commented Apr 8, 2020

Gracias!! Se valora mucho que nos den explicaciones extensivas de porque ocurren las cosas, meritorio de estudiantes universitarios 😄
Me quedó clarito!! Muchas gracias!!

@lily416 lily416 added the resuelto Issues resueltas label Apr 9, 2020
@lily416 lily416 closed this as completed Apr 22, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
contenidos Issues relacionadas con los contenidos del curso general resuelto Issues resueltas
Projects
None yet
Development

No branches or pull requests

4 participants