Problema con propiedades en python3

Iniciado por retr02332, 5 Junio 2020, 08:10 AM

0 Miembros y 1 Visitante están viendo este tema.

retr02332

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.



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

EdePC

Código (python,8) [Seleccionar]
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)


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 (python) [Seleccionar]
dir(ob)
['__doc__', '__init__', '__module__', 'name']


- Para mí lo correcto sería:

Código (python) [Seleccionar]
class Quick_Tasks(object):

  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._name = 8
    else:
      print("nel")


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


Devolviendo:
Código (python) [Seleccionar]
Arroz
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 (python) [Seleccionar]
class TreeNode(object):
 
  def __init__(self, value=None):
    self.value = value

  @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)
  print(tree_node.value)
  tree_node.value = 5
  print(tree_node.value)
  tree_node.value = "cervatillo"
  print(tree_node.value)


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


Devuelve:
Código (python) [Seleccionar]
---
8
8
nel
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

tincopasan

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.