Marc 'BlackJack' Rintsch wrote:

Frans Englich wrote:

Then I have some vague, general questions which perhaps someone can reason from: what is then the preferred methods for solving problems which requires Singletons?

As already mentioned it's similar to a global variable. If I need a "Singleton" I just put it as global into a module. Either initialize it at module level or define a function with the content of your __init__().

If one is determined to both use a Singleton and avoid having a plain module-global variable, one could (ab)use function default parameters:


class __Foo:
    "I am a singleton!"
    pass

def Foo(foo_obj = __Foo()):
    assert isinstance(foo_obj, __Foo
    return foo_obj

Of course, this suffers from the weakness that one might pass an object as an argument to the factory function and thus temporarily override the Singleton-ness of __Foo... but a determined programmer will work around any sort of protection scheme anyhow. ;)

In general, ISTM that if one wants a Singleton, it's best to create it via a factory function (even if that function then masquerades as a class). This gives you pretty good control over the circumstances in which your Singleton will be created and/or retrieved, and it also makes it trivial to replace the Singleton with some other pattern (such as, e.g., a Flyweight or Borg object) should the need to refactor arise.

Jeff Shannon
Technician/Programmer
Credit International


-- http://mail.python.org/mailman/listinfo/python-list

Reply via email to