elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  Problema con propiedades en python3
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con propiedades en python3  (Leído 2,270 veces)
retr02332

Desconectado Desconectado

Mensajes: 89


Learn, Imagine and Create.


Ver Perfil
Problema con propiedades en python3
« en: 5 Junio 2020, 08:10 am »

asa que llevo horas en un programa, y de la nada note un error demasiado extraño. Entonces tras horas y horas de buscar, llegue a estas dos clases que hacen lo mismo pero no dan lo mismo (lo esperado mas bien)

No se si de la horas que llevo no veo que es, pero me parece raro esto que esta pasando.

Pido colaboración, el que no funciona es el mio, y el que funciona es el de Internet.

PDTA: Mi implementación también debería devolver 8

Muchas gracias.

Código:

class Quick_Tasks():

    def __init__(self,name=None):
        self.name = name

    @property
    def name(self):
        return self.__name

    @name.setter
    def name(self, value):
        if type(value).__name__ == "int":
            self.__value = 8
        else:
            print("nel")


obj = Quick_Tasks("Arroz")
print("")
print(obj.name)
obj.name = 45
print(obj.name)

#########################################################

class TreeNode(object):
    """
    El error es que no pueod usar property con parametros. Debe ser asignacion manual. (ignorar)
    """
    def __init__(self, value = None):
        self.value = value
        self._left_node = None
        self._right_node = None

    @property
    def value(self):
        return self.__value

    @value.setter
    def value(self, value):
        if type(value).__name__ == "int":
            self.__value = 8
        else:
            print("nel")

def main():
    tree_node = TreeNode(3)
    #tree_node.value = 3
    print (tree_node.value)

if __name__ == '__main__':
    print("")
    main()

Citar
Arroz
45

8


« Última modificación: 5 Junio 2020, 08:12 am por clay2332xd » En línea

EdePC
Moderador Global
***
Desconectado Desconectado

Mensajes: 2.054



Ver Perfil
Re: Problema con propiedades en python3
« Respuesta #1 en: 5 Junio 2020, 20:45 pm »

Código
  1. class Quick_Tasks():
  2.  
  3.    def __init__(self,name=None):
  4.        self.name = name
  5.  
  6.    @property
  7.    def name(self):
  8.        return self.__name
  9.  
  10.    @name.setter
  11.    def name(self, value):
  12.        if type(value).__name__ == "int":
  13.            self.__value = 8
  14.        else:
  15.            print("nel")
  16.  
  17.  
  18. obj = Quick_Tasks("Arroz")
  19. print("")
  20. print(obj.name)
  21. obj.name = 45
  22. print(obj.name)

Me genera advertencias en la línea 8 __name no se puede resolver, yo he llevado python básico en Instituto pero no recuerdo haber visto los @property ... lo he busca en la documentación de Python en todas lo que tenía que ver con Class pero como siempre no encontré nada relacionado, sin embargo si que hay información bajo property (build-in class), pues es imposible llegar a esta parte de la documentación a partir de Class (pésima documentación XD)

No sé si se trate de propiedades internas ocultas en lo más profundo de la documentación, pero a simple vista me parece que están mal, al menos a ejecutar un dir(obj) no me muestra las propiedades __name ni __value:

Código
  1. dir(ob)
  2. ['__doc__', '__init__', '__module__', 'name']

- Para mí lo correcto sería:

Código
  1. class Quick_Tasks(object):
  2.  
  3.  def __init__(self, name=None):
  4.    self._name = name
  5.  
  6.  @property
  7.  def name(self):
  8.    return self._name
  9.  
  10.  @name.setter
  11.  def name(self, value):
  12.    if type(value).__name__ == "int":
  13.      self._name = 8
  14.    else:
  15.      print("nel")
  16.  
  17.  
  18. obj = Quick_Tasks("Arroz")
  19. print("----")
  20. print(obj.name)
  21. obj.name = 45
  22. print(obj.name)

Devolviendo:
Código
  1. Arroz
  2. 8

-- Es algo raro darle intentar Setearle un 45 y en su lugar ponerle un 8, pero el ejemplo es ese XD. Al menos eso es lo que más o menos entiendo que se desea hacer...

En caso de tu Código, estás dándole directamente un valor al Inicializar tu Clase, no estás usando tu Setter, en su lugar podrías llamar al Setter, pero tienes que hacer más legible tu código para evitarse problemas de mal-entendido con los nombres:

Código
  1. class TreeNode(object):
  2.  
  3.  def __init__(self, value=None):
  4.    self.value = value
  5.  
  6.  @property
  7.  def value(self):
  8.    return self._value
  9.  
  10.  @value.setter
  11.  def value(self, value):
  12.    if type(value).__name__ == "int":
  13.      self._value = 8
  14.    else:
  15.      print("nel")
  16.  
  17.  
  18. def main():
  19.  tree_node = TreeNode(3)
  20.  print(tree_node.value)
  21.  tree_node.value = 5
  22.  print(tree_node.value)
  23.  tree_node.value = "cervatillo"
  24.  print(tree_node.value)
  25.  
  26.  
  27. if __name__ == '__main__':
  28.  print("---")
  29.  main()
  30.  

Devuelve:
Código
  1. ---
  2. 8
  3. 8
  4. nel
  5. 8

- Me reservo los __variable__  y __variable para las variables, propiedades y métodos propios del lenguaje o que sean muy especiales. Además hago una distinción clara de nombres, uso _variable para variables, propiedades o métodos de uso interno, y variable para uso externo


En línea

tincopasan


Desconectado Desconectado

Mensajes: 1.286

No es lo mismo conocer el camino que recorrerlo.


Ver Perfil
Re: Problema con propiedades en python3
« Respuesta #2 en: 7 Junio 2020, 00:36 am »

en realidad está usando decoradores, property es una función que no está definida, así que como está este código no puede funcionar, en cuanto a las propiedades, esta confundiendo el nombre de las variables con propiedades, __name__ está definida en el lenguaje __value no existe como tal salvo que el la declare antes.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Python 2.7.5 o Python3
Scripting
TrokaMc 1 2,007 Último mensaje 3 Enero 2014, 21:44 pm
por Max00355
Ejercicio de novato en Python3
Ejercicios
Itzhack 3 3,007 Último mensaje 24 Septiembre 2014, 16:35 pm
por Itzhack
Subprocesos en python3
Scripting
Sergiolocuelo 2 1,981 Último mensaje 19 Agosto 2018, 17:32 pm
por Sergiolocuelo
Duda en python3
Scripting
reconFito 3 2,150 Último mensaje 19 Diciembre 2019, 03:18 am
por engel lex
[Python3-Ayuda]
Scripting
reconFito 0 1,772 Último mensaje 2 Abril 2020, 02:54 am
por reconFito
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines