Errores #41
Make 'singleton' classes *real* singleton classes
| Status: | Resuelta | Start: | 03/23/2009 | |
|---|---|---|---|---|
| Priority: | Normal | Due date: | ||
| Assigned to: | % Done: | 100% |
||
| Category: | YASS - core | |||
| Target version: | 0.5.0 |
Description
core, sysconfig and some others are implemented in a 'singleton fashion', that is: there is only ONE instance of that class, no matter how many times we instanciate it.
Current implementation is not really a singleton but a 'mobnostate': we can have multiple instances of a class, but they all share the same state (variables, etc.).
We should implement real singleton classes, because we don't really need core instances all around wasting memory...
Example:
class Singleton:
""" A python singleton """
class __impl:
""" Implementation of the singleton interface """
def spam(self):
""" Test method, return singleton id """
return id(self)
# storage for the instance reference
__instance = None
def __init__(self):
""" Create singleton instance """
# Check whether we already have an instance
if Singleton.__instance is None:
# Create and remember instance
Singleton.__instance = Singleton.__impl()
# Store instance reference as the only member in the handle
self.__dict__['_Singleton__instance'] = Singleton.__instance
def __getattr__(self, attr):
""" Delegate access to implementation """
return getattr(self.__instance, attr)
def __setattr__(self, attr, value):
""" Delegate access to implementation """
return setattr(self.__instance, attr, value)
# Test it
s1 = Singleton()
print id(s1), s1.spam()
s2 = Singleton()
print id(s2), s2.spam()
# Sample output, the second (inner) id is constant:
# 8172684 8176268
# 8168588 8176268
History
Updated by Iñaki Baz Castillo over 2 years ago
Joder, qué poco me mola Python. Todo eso de las singleton classes es mucho más ameno y visual en Ruby. Ejemplo:
class Test
def self.hola
puts "hola tio"
end
end
Test.hola
=> "hola"
Updated by Saúl Ibarra Corretgé over 2 years ago
Iñaki Baz Castillo wrote:
Joder, qué poco me mola Python. Todo eso de las singleton classes es mucho más ameno y visual en Ruby. Ejemplo: [...]
Tuuu, no es eso. El tema es que aunque instancies 100 veces una clase siempre obtengas la misma instancia real, no creas instancias nuevas y tal.
En python hay 1000 maneras de hacer cada cosa, y después de mirar bastante esta es la más bonita que he visto y que mejor encaja con cómo es YASS por dentro :)
En los lenguajes dinámicos como Ruby o Python algunos patrones como el singleton son un poco 'feos' de implementar. En Ruby: http://www.lacaraoscura.com/2006/05/23/patrones-de-diseno-en-ruby-singleton/
Updated by Iñaki Baz Castillo over 2 years ago
ok, no es lo que yo decía. Yo me refería a que en vez de usar una instancia puedes usar la clase como tal (de hecho en Ruby, una clase también es una instancia y puede tener sus atributos y todo).
Vamos, que sin tener que hacer "Class.new".
Updated by Saúl Ibarra Corretgé over 2 years ago
Iñaki Baz Castillo wrote:
ok, no es lo que yo decía. Yo me refería a que en vez de usar una instancia puedes usar la clase como tal (de hecho en Ruby, una clase también es una instancia y puede tener sus atributos y todo).
Vamos, que sin tener que hacer "Class.new".
Esos son atributos/métodos estáticos, son a nivel de clase, no de instancia :) De hecho los atributos estáticos son el fundamento del patrón 'monostate'.
Updated by Iñaki Baz Castillo over 2 years ago
Saúl Ibarra wrote:
Que no que nooo !!!!Esos son atributos/métodos estáticos, son a nivel de clase, no de instancia :) De hecho los atributos estáticos son el fundamento del patrón 'monostate'.
Que en Ruby una clase es a su vez una instancia de la clase Object, y como estancia también puede tener atributos (no hablo de atributos de clase). De hecho los atributos de clase (que también existen en Ruby) son del tipo "@@variable" mientras que los atributos de instancia son "@variable".
- Una instancia de una clase puede tener atributos de instancia y usar atributos de clase.
- Una clase (también es una instancia) puede tener sus propios atributos de instancia manejnado sólo la clase, sin crear instancias. También puede usar atributos de clase.
Ejemplo:
class MyClass
# atributo de clase
@@atr_clase = "bye"
# método de clase
def self.saludo
# atributo de instancia usado a nivel de clase (no de instancia)
@atr_instancia
end
# método de clase
def self.saludo=(valor)
@atr_instancia = valor
end
# método de instancia
def adios
@@atr_clase
end
# método de instancia
def adios=(valor)
@@atr_clase = valor
end
end
irb> MyClass.saludo
nil
irb> MyClass.saludo="holaaa"
"holaaa"
irb> MyClass.saludo
"holaaa"
irb> my = MyClass.new
#<MyClass:0xb7bf09e8>
irb> my.adios
"bye"
irb> my.adios="hasta luego"
"hasta luego"
irb> my.adios
"hasta luego"
Updated by Saúl Ibarra Corretgé over 2 years ago
Iñaki Baz Castillo wrote:
Saúl Ibarra wrote:
Que no que nooo !!!! Que en Ruby una clase es a su vez una instancia de la clase Object, y como estancia también puede tener atributos (no hablo de atributos de clase). De hecho los atributos de clase (que también existen en Ruby) son del tipo "@@variable" mientras que los atributos de instancia son "@variable".Esos son atributos/métodos estáticos, son a nivel de clase, no de instancia :) De hecho los atributos estáticos son el fundamento del patrón 'monostate'.
- Una instancia de una clase puede tener atributos de instancia y usar atributos de clase.
- Una clase (también es una instancia) puede tener sus propios atributos de instancia manejnado sólo la clase, sin crear instancias. También puede usar atributos de clase.
Ejemplo: [...]
Hummm, ya veo... aunque realmente se comportan como atributos de clase, ¿no? ¿o tienen alguna otra propiedad especial?
Updated by Iñaki Baz Castillo over 2 years ago
Saúl Ibarra wrote:
Hummm, ya veo... aunque realmente se comportan como atributos de clase, ¿no? ¿o tienen alguna otra propiedad especial?
La diferencia es que a un atributo de clase se puede acceder desde la clase y desde instancias. A un atributo de instancia pero para una clase sólo se puede acceder desde la clase.
Las variables de clase son un coñazo (y no recomendadas en Ruby). Por ejemplo es necesario inizializarlas al comienzo de la clase:
class MyClass # atributo de clase @@atr_clase = "bye" ...
Lo mismo con atributos de instancia en una clase no requiere inicialización.
Updated by Saúl Ibarra Corretgé over 2 years ago
- Target version changed from Nice to have to 0.5.0
- % Done changed from 0 to 40
The core is now a real singleton class which is also thread safe :) We should do the same for the sysconfig class.
Updated by Saúl Ibarra Corretgé over 2 years ago
- Status changed from Nueva to Resuelta
- % Done changed from 40 to 100
Done! Both core and sysconfig are now thread-safe singleton classes.