Me gusto mucho el vídeo; creo que la segunda forma es más legible, porque el patrón es más explicito. Pero en el primer caso, no habría que adicionar tanta sintaxis adicional; solo agregar los parámetros *args, **kargs en donde se invoque el método constructor __new__
Aca te dejó un tutorial de PYTHON desde CERO A MASTER, no hace faltas que sepas algo de programación, si te gusta el video dale like, suscribite, y compartilo, me ayudaras mucho: th-cam.com/video/sNdMX_3Vxh0/w-d-xo.html
Me funcionó perfectamente... Pero como hago para aceder a los atributos? Ejemplo: print(user1.username) No logré acceder a los atributos de la clase user.
class User(object): __instance = None def __new__(cls): if cls.__instance is None: # if there is no instance cls.__instance = super().__new__(cls) # class as argument. return cls.__instance # executed only once. if __name__ == "__main__": user1 = User() user2 = User() print(user1 is user2)
Yo las uso para ahorrar memoria, ya que las implementó en librerías. Ejemplo una clase que te ayude a calcular en tiempo real el precio de un producto, para instanciarlo n* veces lo haces singleton.
Esto tiene que ver con el diseño orientado a objetos, sabes que una instancia de una clase requiere de memoria para estar alojada, cada vez que tu usas la instanciación creas un espacio en memoria, si tuvieras la clase Carro y requieres 5 carros cada uno con sus propiedades y atributos específicos los creas en 5 variables uno por uno. Pero hay ciertas clases que agrupan funcionalidad no repetitiva, imagínate que tuvieras una clase llamada Registro, en donde tiene un método (función) que necesita usar un objeto de tipo Carro como argumento, ese tipo de clases que solo agrupan funcionalidades no requieren de tener nada más que un espacio en memoria. Te preguntarás por que ? Bueno por que sería un mal diseño instanciar 5 veces la clase Registro si las 5 instancias hacen lo mismo que es registrar un carro, en el caso de los carros no por que puedes tener un mustang, audi etc... Entonces para la creación de ciertos objetos que pertenecen a una clase determinada en donde siempre se hagan las mismas operaciones y requieras que la memoria este optima se utiliza el patrón singleton, recordando que es un patrón de diseño de tipo creacional el cual te indica que en una clase determinada solo puede haber una instancia para garantizar el uso de memoria.
Yo lo uso en códigos para dispositivos electrónicos. Sólo hay una sóla placa madre (arduino, rpi, etc) pero se usan los pines en todo el script. Como el pin está conectado a un led en todo lugar del script y eso no va a cambiar, pues, usar un singleton para el Board y listo. Así, se puede usar en todo momento y lugar del script
Usando este metodo, entenderia que User deja de ser una clase correcto? ya no se podria usar __super()__ ni cls
Me gusto mucho el vídeo; creo que la segunda forma es más legible, porque el patrón es más explicito.
Pero en el primer caso, no habría que adicionar tanta sintaxis adicional; solo agregar los parámetros *args, **kargs en donde se invoque el método constructor __new__
Gracias por enseñar sobre patrones, me es muy útil.
Aca te dejó un tutorial de PYTHON desde CERO A MASTER, no hace faltas que sepas algo de programación, si te gusta el video dale like, suscribite, y compartilo, me ayudaras mucho:
th-cam.com/video/sNdMX_3Vxh0/w-d-xo.html
Me funcionó perfectamente... Pero como hago para aceder a los atributos?
Ejemplo:
print(user1.username)
No logré acceder a los atributos de la clase user.
def singleton(cls):
instances = {} # dictionary
def wrapper(*args, **kwargs): # arguments and dictionary of arguments
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return wrapper
@singleton # decorator
class User(object):
def __init__(self, username):
self.username = username
if __name__ == '__main__':
user = User('admin')
user2 = User('guest')
print(user is user2)
Que username tiene al final el objeto instanciado?
El de la primera instancia.
cls es como el this de toda la vida?
No, el this de toda la vida sería el "self" en python .
Me sale un error, dice que el objeto no es llamable
class User(object):
__instance = None
def __new__(cls):
if cls.__instance is None: # if there is no instance
cls.__instance = super().__new__(cls) # class as argument.
return cls.__instance # executed only once.
if __name__ == "__main__":
user1 = User()
user2 = User()
print(user1 is user2)
Entendí pero, ¿Para qué sirve ese patrón de diseño?🤔
Yo las uso para ahorrar memoria, ya que las implementó en librerías. Ejemplo una clase que te ayude a calcular en tiempo real el precio de un producto, para instanciarlo n* veces lo haces singleton.
Esto tiene que ver con el diseño orientado a objetos, sabes que una instancia de una clase requiere de memoria para estar alojada, cada vez que tu usas la instanciación creas un espacio en memoria, si tuvieras la clase Carro y requieres 5 carros cada uno con sus propiedades y atributos específicos los creas en 5 variables uno por uno.
Pero hay ciertas clases que agrupan funcionalidad no repetitiva, imagínate que tuvieras una clase llamada Registro, en donde tiene un método (función) que necesita usar un objeto de tipo Carro como argumento, ese tipo de clases que solo agrupan funcionalidades no requieren de tener nada más que un espacio en memoria.
Te preguntarás por que ? Bueno por que sería un mal diseño instanciar 5 veces la clase Registro si las 5 instancias hacen lo mismo que es registrar un carro, en el caso de los carros no por que puedes tener un mustang, audi etc...
Entonces para la creación de ciertos objetos que pertenecen a una clase determinada en donde siempre se hagan las mismas operaciones y requieras que la memoria este optima se utiliza el patrón singleton, recordando que es un patrón de diseño de tipo creacional el cual te indica que en una clase determinada solo puede haber una instancia para garantizar el uso de memoria.
Yo lo uso en códigos para dispositivos electrónicos. Sólo hay una sóla placa madre (arduino, rpi, etc) pero se usan los pines en todo el script. Como el pin está conectado a un led en todo lugar del script y eso no va a cambiar, pues, usar un singleton para el Board y listo. Así, se puede usar en todo momento y lugar del script