1168

This question is not for the discussion of whether or not the singleton design pattern is desirable, is an anti-pattern, or for any religious wars, but to discuss how this pattern is best implemented in Python in such a way that is most pythonic. In this instance I define 'most pythonic' to mean that it follows the 'principle of least astonishment'.

I have multiple classes which would become singletons (my use-case is for a logger, but this is not important). I do not wish to clutter several classes with added gumph when I can simply inherit or decorate.

Best methods:


Method 1: A decorator

def singleton(class_):
    instances = {}
    def getinstance(*args, **kwargs):
        if class_ not in instances:
            instances[class_] = class_(*args, **kwargs)
        return instances[class_]
    return getinstance

@singleton
class MyClass(BaseClass):
    pass

Pros

  • Decorators are additive in a way that is often more intuitive than multiple inheritance.

Cons

  • While objects created using MyClass() would be true singleton objects, MyClass itself is a a function, not a class, so you cannot call class methods from it. Also for
x = MyClass();
y = MyClass();
t = type(n)();

then x == y but x != t && y != t


Method 2: A base class

class Singleton(object):
    _instance = None
    def __new__(class_, *args, **kwargs):
        if not isinstance(class_._instance, class_):
            class_._instance = object.__new__(class_, *args, **kwargs)
        return class_._instance

class MyClass(Singleton, BaseClass):
    pass

Pros

  • It's a true class

Cons

  • Multiple inheritance - eugh! __new__ could be overwritten during inheritance from a second base class? One has to think more than is necessary.

Method 3: A metaclass

class Singleton(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]

#Python2
class MyClass(BaseClass):
    __metaclass__ = Singleton

#Python3
class MyClass(BaseClass, metaclass=Singleton):
    pass

Pros

  • It's a true class
  • Auto-magically covers inheritance
  • Uses __metaclass__ for its proper purpose (and made me aware of it)

Cons

  • Are there any?

Method 4: decorator returning a class with the same name

def singleton(class_):
    class class_w(class_):
        _instance = None
        def __new__(class_, *args, **kwargs):
            if class_w._instance is None:
                class_w._instance = super(class_w,
                                    class_).__new__(class_,
                                                    *args,
                                                    **kwargs)
                class_w._instance._sealed = False
            return class_w._instance
        def __init__(self, *args, **kwargs):
            if self._sealed:
                return
            super(class_w, self).__init__(*args, **kwargs)
            self._sealed = True
    class_w.__name__ = class_.__name__
    return class_w

@singleton
class MyClass(BaseClass):
    pass

Pros

  • It's a true class
  • Auto-magically covers inheritance

Cons

  • Is there not an overhead for creating each new class? Here we are creating two classes for each class we wish to make a singleton. While this is fine in my case, I worry that this might not scale. Of course there is a matter of debate as to whether it aught to be too easy to scale this pattern...
  • What is the point of the _sealed attribute
  • Can't call methods of the same name on base classes using super() because they will recurse. This means you can't customize __new__ and can't subclass a class that needs you to call up to __init__.

Method 5: a module

a module file singleton.py

Pros

  • Simple is better than complex

Cons

  • Not lazily instantianted
theheadofabroom
  • 15,961
  • 5
  • 29
  • 63
  • 14
    Another three techniques: use a module instead (often - generally, I think - this is a more appropriate pattern for Python but it depends a bit on what you're doing with it); make a single instance and deal with it instead (`foo.x` or if you insist `Foo.x` instead of `Foo().x`); use class attributes and static/class methods (`Foo.x`). – Chris Morgan Jul 20 '11 at 10:55
  • 11
    @ChrisMorgan: If you're going to use class/static methods only, then don't bother making a class, really. – Cat Plus Plus Jul 20 '11 at 10:57
  • 1
    Duplicate of http://stackoverflow.com/questions/42558/python-and-the-singleton-pattern and http://stackoverflow.com/questions/31875/is-there-a-simple-elegant-way-to-define-singletons-in-python. – agf Jul 20 '11 at 10:58
  • @Cat: yep. The third case would tend to be better expressed as the first or second. – Chris Morgan Jul 20 '11 at 10:58
  • 2
    @Cat: The effect is similar, however the reasons behind creating a global variable can be just about anything, including not knowing any better. Why does one create a singleton? If you have to ask you shouldn't be here. This explicitness is not only more pythonic, but makes maintenance a lot more simple. Yes singletons are syntactic sugar for globals, but then classes are syntactic sugar for a whole bunch of unsightly stuff and I don't think anyone will tell you you're always better off without them. – theheadofabroom Jul 20 '11 at 14:22
  • 15
    @BiggAl: Singletons are *not* Pythonic, no matter how you implement them. They are a sign of a flawed design at best. – Cat Plus Plus Jul 20 '11 at 14:40
  • Maybe it would help if I were to explain the purpose. I wish to have a few different logging classes that work in different ways with a variety of different sources/destinations. Now I want to apply these loggers to a variety of different functions as a decorator, and only need one logger of each type, init'd against many different functions. I.e. One that appends to a text file, one prints stdout, one prints stderr, and another sets a trace for pdb. These would all then be triggered differently at different logging levels. To me logging has always seemed a natural candidate for Singletons.No? – theheadofabroom Jul 20 '11 at 15:24
  • @Cat Anyway, whether or not Singletons are a good idea was never supposed to be the question. The question was supposed to be how they are best implemented. I'd guess my question will not be reopened, which is a shame. Anyhow, I wouldn't have described you as rude - I think a lively debate is always interesting, it's just rather not the point of stackoverflow. – theheadofabroom Jul 20 '11 at 16:14
  • @BiggAl You copied the wrong code from my post. That's my fixes to __Method #2__, not my metaclass. I saw you want to run `__init__` every time; I added that code to my post. I also commented on __Method #4__. Summary: it's bad for a class to be its own base class. – agf Jul 27 '11 at 05:18
  • @agf Cheers for the edit, as I couldn't see the problem, as the method I had put up was a tweak of yours. To be honest, other than s/object/type/g, I don't see the problem - in yours a dict is shared with all `Singleton` type classes yes? And the `__new__` method selects the correct one by using the class as its hash, creating it if not already done. In my version each class had access to only its own instance, or the base instance if that had been created, and then the `__new__` method checks that it is an instance of the correct class. This surely shares less state ergo so is more desirable? – theheadofabroom Jul 29 '11 at 12:12
  • @BiggAl The other problem is `__call__` vs. `__new__`. In a metaclass, `__new__` means when the __class__ is new, not when the __instance__ is new. You want the method called every time someone tries to make a new __instance__ so you need to use `__call__`. Even if you fix your version to use `type` and `super` instead of `object`, it won't make singletons unless you use `__call__` -- test it. `_instance` vs. `_instances` wasn't the problem. Your way might even be better, I have to think about it. – agf Jul 29 '11 at 14:26
  • Ah cool, I hadn't noticed that. Metaclasses seem very powerful, do you know of any resources that would show a little more about them? I found [this](http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python) question, but do you know of any other great resources? – theheadofabroom Jul 30 '11 at 09:42
  • Check out the other SO questions that come up for "Metaclass Python". Read all of http://docs.python.org/reference/datamodel.html. Recently I saw http://bitshaq.com/2011/07/14/basic-intro-to-python-meta-programming/ which looks pretty good. Read https://secure.wikimedia.org/wikipedia/en/wiki/Metaclass. Just keep thinking "it's a class who's instances are class definitions". – agf Jul 31 '11 at 02:51
  • 19
    The anti-signletons sentiment is cargo cult programming at its worst. Same with people hearing (few bothered to actually read) "Goto statement considered harmful" and think gotos are a sign of bad code regardless of context. – Hejazzman Nov 30 '15 at 13:31
  • Why can't i say that a class with only class methods and class attributes is a singleton class ? – deepak Jun 21 '16 at 10:52
  • 1
    @deepak because strictly speaking that's a static class, or as close as you'd get in python. You can still add instance attributes unless you prevent instantiation, at which point it becomes more truly static – theheadofabroom Jun 21 '16 at 11:10
  • @theheadofabroom but in python you can always use setattr(object,name,value) to add instance variable, i don't see any concrete reason of why should use any of those methods explained below to implement singleton, when python itself by default supports it. Let me know if i am missing anything. – deepak Jun 21 '16 at 11:23
  • With a Singleton you have only a single instance, ergo you can setattr without any inconsistencies. This is why I was saying that for a static class you would have to prevent instantiation – theheadofabroom Jun 21 '16 at 11:26
  • @agf I need to make singleton on the basis of arguments instead of class names. I've posted a question here on SO -> http://stackoverflow.com/questions/39033946/python-argument-based-singleton – Pankaj Singhal Aug 19 '16 at 08:23
  • 1
    Hi, thanks for your elaborate post. I am fairly new to pattern programming and to python actually, and I am surprised that although method 2 seems to most well known one (it s everywhere), hardly ever someone mentions that despite only one object is created, __init__() is called every time Singleton() or MyClass() are used anywhere. I didn't try, but AFAIK this is true for all other methods too. This hardly seems desirable when implementing a singleton, or am i missing something? Of course the solution consists of setting an attribute to avoid performing __init__ twice. Just curious – chrisvp Sep 04 '16 at 11:52
  • 1
    @chrisvp indeed you probably want some form of guard around init, although I'd also say that you very rarely want a Singleton, over the years since this question was written, I've only really needed a Singleton twice, and one of those was taken out when I made things more functional, and therefore this shared state became undesirable – theheadofabroom Sep 04 '16 at 11:57
  • How would you kill the object of the 3rd method? – Lior Magen Dec 05 '16 at 14:22
  • @LiorMagen You wouldn't - how would you know that it wasn't going to instantiated again? – theheadofabroom Dec 05 '16 at 15:10
  • @theheadofabroom I wouldn't, this will be relevant if I want to delete an existing object and create a new one instead of it. No way of doing that? – Lior Magen Dec 06 '16 at 12:12
  • 1
    How about implementing it as a module? – gaurav parashar Jan 31 '18 at 11:34
  • Method 3 solved my problem with threading: `class MyClass(threading.Thread, metaclass=Singleton):` – tammoj May 06 '19 at 13:21
  • @hejazzman further, the metaclass method negates the reason singletons are considered bad. For testing, you can take away the singleton-ness of the object so you no longer have shared state. – JeffCharter Nov 15 '19 at 20:35
  • @JeffCharter I'm not sure this is the only reason singletons are sometimes considered an antipattern, but you're right that it does allow you to negate that particular issue. In a lot of cases the issue is not the fact that you use a singleton, but that ending up with an architecture where a singleton is useful often points to other architectural issues. Obviously this is a rule of thumb rather than anything hard and fast, which is why I'd still support the usefulness of my question all these years later ;) – theheadofabroom Nov 15 '19 at 21:16
  • Saw (following). Yet, another way of implementing singleton pattern - apart from the answers to this post. Hope it helps! https://www.tutorialspoint.com/python_design_patterns/python_design_patterns_singleton.htm – dvlper Oct 16 '20 at 15:54

27 Answers27

798

Use a Metaclass

I would recommend Method #2, but you're better off using a metaclass than a base class. Here is a sample implementation:

class Singleton(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]
        
class Logger(object):
    __metaclass__ = Singleton

Or in Python3

class Logger(metaclass=Singleton):
    pass

If you want to run __init__ every time the class is called, add

        else:
            cls._instances[cls].__init__(*args, **kwargs)

to the if statement in Singleton.__call__.

A few words about metaclasses. A metaclass is the class of a class; that is, a class is an instance of its metaclass. You find the metaclass of an object in Python with type(obj). Normal new-style classes are of type type. Logger in the code above will be of type class 'your_module.Singleton', just as the (only) instance of Logger will be of type class 'your_module.Logger'. When you call logger with Logger(), Python first asks the metaclass of Logger, Singleton, what to do, allowing instance creation to be pre-empted. This process is the same as Python asking a class what to do by calling __getattr__ when you reference one of it's attributes by doing myclass.attribute.

A metaclass essentially decides what the definition of a class means and how to implement that definition. See for example http://code.activestate.com/recipes/498149/, which essentially recreates C-style structs in Python using metaclasses. The thread What are some (concrete) use-cases for metaclasses? also provides some examples, they generally seem to be related to declarative programming, especially as used in ORMs.

In this situation, if you use your Method #2, and a subclass defines a __new__ method, it will be executed every time you call SubClassOfSingleton() -- because it is responsible for calling the method that returns the stored instance. With a metaclass, it will only be called once, when the only instance is created. You want to customize what it means to call the class, which is decided by it's type.

In general, it makes sense to use a metaclass to implement a singleton. A singleton is special because is created only once, and a metaclass is the way you customize the creation of a class. Using a metaclass gives you more control in case you need to customize the singleton class definitions in other ways.

Your singletons won't need multiple inheritance (because the metaclass is not a base class), but for subclasses of the created class that use multiple inheritance, you need to make sure the singleton class is the first / leftmost one with a metaclass that redefines __call__ This is very unlikely to be an issue. The instance dict is not in the instance's namespace so it won't accidentally overwrite it.

You will also hear that the singleton pattern violates the "Single Responsibility Principle" -- each class should do only one thing. That way you don't have to worry about messing up one thing the code does if you need to change another, because they are separate and encapsulated. The metaclass implementation passes this test. The metaclass is responsible for enforcing the pattern and the created class and subclasses need not be aware that they are singletons. Method #1 fails this test, as you noted with "MyClass itself is a a function, not a class, so you cannot call class methods from it."

Python 2 and 3 Compatible Version

Writing something that works in both Python2 and 3 requires using a slightly more complicated scheme. Since metaclasses are usually subclasses of type type, it's possible to use one to dynamically create an intermediary base class at run time with it as its metaclass and then use that as the baseclass of the public Singleton base class. It's harder to explain than to do, as illustrated next:

# works in Python 2 & 3
class _Singleton(type):
    """ A metaclass that creates a Singleton base class when called. """
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(_Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]

class Singleton(_Singleton('SingletonMeta', (object,), {})): pass

class Logger(Singleton):
    pass

An ironic aspect of this approach is that it's using subclassing to implement a metaclass. One possible advantage is that, unlike with a pure metaclass, isinstance(inst, Singleton) will return True.

Corrections

On another topic, you've probably already noticed this, but the base class implementation in your original post is wrong. _instances needs to be referenced on the class, you need to use super() or you're recursing, and __new__ is actually a static method that you have to pass the class to, not a class method, as the actual class hasn't been created yet when it is called. All of these things will be true for a metaclass implementation as well.

class Singleton(object):
  _instances = {}
  def __new__(class_, *args, **kwargs):
    if class_ not in class_._instances:
        class_._instances[class_] = super(Singleton, class_).__new__(class_, *args, **kwargs)
    return class_._instances[class_]

class MyClass(Singleton):
  pass

c = MyClass()

Decorator Returning A Class

I originally was writing a comment but it was too long, so I'll add this here. Method #4 is better than the other decorator version, but it's more code than needed for a singleton, and it's not as clear what it does.

The main problems stem from the class being it's own base class. First, isn't it weird to have a class be a subclass of a nearly identical class with the same name that exists only in its __class__ attribute? This also means that you can't define any methods that call the method of the same name on their base class with super() because they will recurse. This means your class can't customize __new__, and can't derive from any classes that need __init__ called on them.

When to use the singleton pattern

Your use case is one of the better examples of wanting to use a singleton. You say in one of the comments "To me logging has always seemed a natural candidate for Singletons." You're absolutely right.

When people say singletons are bad, the most common reason is they are implicit shared state. While with global variables and top-level module imports are explicit shared state, other objects that are passed around are generally instantiated. This is a good point, with two exceptions.

The first, and one that gets mentioned in various places, is when the singletons are constant. Use of global constants, especially enums, is widely accepted, and considered sane because no matter what, none of the users can mess them up for any other user. This is equally true for a constant singleton.

The second exception, which get mentioned less, is the opposite -- when the singleton is only a data sink, not a data source (directly or indirectly). This is why loggers feel like a "natural" use for singletons. As the various users are not changing the loggers in ways other users will care about, there is not really shared state. This negates the primary argument against the singleton pattern, and makes them a reasonable choice because of their ease of use for the task.

Here is a quote from http://googletesting.blogspot.com/2008/08/root-cause-of-singletons.html:

Now, there is one kind of Singleton which is OK. That is a singleton where all of the reachable objects are immutable. If all objects are immutable than Singleton has no global state, as everything is constant. But it is so easy to turn this kind of singleton into mutable one, it is very slippery slope. Therefore, I am against these Singletons too, not because they are bad, but because it is very easy for them to go bad. (As a side note Java enumeration are just these kind of singletons. As long as you don't put state into your enumeration you are OK, so please don't.)

The other kind of Singletons, which are semi-acceptable are those which don't effect the execution of your code, They have no "side effects". Logging is perfect example. It is loaded with Singletons and global state. It is acceptable (as in it will not hurt you) because your application does not behave any different whether or not a given logger is enabled. The information here flows one way: From your application into the logger. Even thought loggers are global state since no information flows from loggers into your application, loggers are acceptable. You should still inject your logger if you want your test to assert that something is getting logged, but in general Loggers are not harmful despite being full of state.

Community
  • 1
  • 1
agf
  • 148,965
  • 36
  • 267
  • 227
  • 5
    No, singletons are never good. Logging might be a good candidate for being a global (as terrible as they are), but certainly not singleton. – Cat Plus Plus Jul 23 '11 at 11:32
  • 12
    Look at http://googletesting.blogspot.com/2008/08/root-cause-of-singletons.html. It is generally anti-singleton (for good reason) but it has a good explaination of why immutable singletons and singletons without side effects don't have the same problems, if you're careful. I'm going to quote it a bit at the end of my post. – agf Jul 23 '11 at 11:36
  • 4
    My problem with singletons is the stupid premise of "only one instance". That and tonne of thread safety problems. And dependency hiding. Globals are bad, and singletons are just globals with more problems. – Cat Plus Plus Jul 23 '11 at 11:46
  • @agf I'll probably accept and award this answer, but shall give a little time for others. I've not worked with metaclasses before, and although I've had a quick google, the answer may be more valuable to future readers if some more explanation could be given on how these are used, what they effect, and any pitfalls to watch out for. – theheadofabroom Jul 24 '11 at 16:42
  • @BiggAl - You've mis-copied my code into your post -- that's my corrections to #2 not my metaclass. Also, you missed an important problem with that particular implementation of a decorator returning a class. – agf Jul 28 '11 at 02:17
  • 6
    @Cat There are very good uses for singletons. Lazy instantiation of hardware modules (especially in single threaded applications) is one of them (but thread safe singletons also exist). – Paul Manta Aug 06 '11 at 13:47
  • @Cat Another use came to mind (this is an example from the game I'm writing atm). I have an EventManager class written in C++ and exposed to Python. I need both languages to queue events in the same manager. I could, somehow, pass the same instance of the manager as a parameter to functions in both languages, but that would require a lot of work and the benefits would literally be nil. Actually, it might make the code harder to follow... – Paul Manta Aug 06 '11 at 13:51
  • 2
    @agf, when implementing Singleton through metaclass, why did you use "__call__" not "__new__"? and What's the difference? – Alcott Sep 20 '11 at 06:25
  • 3
    @Alcott `__new__` in a metaclass is when the _class_ is new -- when it's defined, not when the _instance_ would be new. Calling the class (`MyClass()`) is the operation you want to override, not the definition of the class. If you really want to understand how Python works, the best thing you can do (other than keep using it) is read http://docs.python.org/reference/datamodel.html. A good reference on metaclasses is http://eli.thegreenplace.net/2011/08/14/python-metaclasses-by-example/. A good article on singletons is the series from the google blog I linked in this answer. – agf Sep 20 '11 at 06:28
  • Also, see http://stackoverflow.com/questions/31875/is-there-a-simple-elegant-way-to-define-singletons-in-python for more singleton stuff if you haven't found that yet. – agf Sep 20 '11 at 06:30
  • @martineau It's an easy mistake to make. Python 3 has improved the metaclass syntax by making it a keyword argument: `Logger(metaclass = Singleton)`. – agf Dec 09 '12 at 22:34
  • Instead of `class Singleton(_Singleton('SingletonMeta', (object,), {})): pass` you could remove one class by using an assignment: `Singleton = _Singleton('Singleton', (object,), {})`. – FichteFoll Oct 01 '14 at 01:31
  • @agf: May I ask you to elaborate on what you think is the right way to instantiate the internal state of the `Logger` class when using the metaclass Singleton? In particular, I find myself waffling on whether it is better to implement `Logger.__init__` in order to lazily instantiate Logger's state, or to initialize Logger's state as a class member (not lazy, but more clear). – Malina Feb 24 '15 at 17:33
  • Is it better to use `Singletone._instances` rather than `cls._instances` in the `__call__` function? Otherwise the `classes` of `Singletone` may define its own class variable `_instances` and conflict with `Singletone`'s. – Eastsun May 24 '15 at 05:01
  • @Eastsun If you're worried about that, then the right thing to do would be to use `__instances`. See the [name mangling docs](https://docs.python.org/2/tutorial/classes.html#private-variables-and-class-local-references) for more info. That will prevent it being accidentally overridden without depending on the name of the class. – agf May 24 '15 at 18:38
  • @Christophe, consider also inheritance. Perhaps an App singleton, and lots of different types of Apps that inherent from that (LinuxApp, MobileApp, DesktopApp) etc – Jonathan Sep 02 '15 at 23:29
  • @agf I want to return object on the basis of arguments, not on class name basis. Can someone provide a solution of my question which I've posted here -> http://stackoverflow.com/questions/39033946/python-argument-based-singleton – Pankaj Singhal Aug 19 '16 at 08:22
  • @agf you mentined that `_instances` needs to be called on the `cls` level, and said it is not defined in the `cls namespace`. How is that possible? on which namespace does the `cls._instances` attribute defined? – Chen A. Sep 24 '17 at 07:27
  • @Vinny I'm not totally sure I understand your question, feel free to clarify. In my example, what I'm saying is you can't accidentally do `self._instances` and override it in an instance of e.g. `Logger`. You'd have to do `Logger._instances` or `type(self)`._instances` or similar. So if other classes in multiple inheritance also use the name `_instances`, you're still generally going to be save from accidentally overriding it. Also as I mentioned in a comment, if you double the underscore Python will further hide the variable and make it even safer. – agf Sep 24 '17 at 15:25
  • Also, @Vinny -- was this post linked from a blog post of something? It seems like it's been getting a lot of votes recently; before that I'd totally forgot about it. – agf Sep 24 '17 at 15:26
  • @agf I got it now, after some expirement. My doubt was where the _instances variable is actually saved (namespace), and I understand what you mean in your comment. I got to this by another answer of yours where you linked to this thread for further explanation. It is defiantly worth to be mentioned in a blogpost :-) – Chen A. Sep 24 '17 at 20:18
  • @MichaelBerdyshev It should in Python 3. – agf Dec 18 '17 at 01:34
  • 2
    How about using a Singleton class in order to manage hardware components? Imagine, you have LCD display (on your RPi for example) and you wrote a small python script called displayManager.py. I think it completely fits into the "the most common reason is they are implicit shared state" definition mention here. If many other components are using this LCD display, they are using a shared state somehow. Why not doing so via a Singleton class. – user2128702 Aug 25 '18 at 13:56
  • Additional question: should one use [weakref.WeakValueDictionary](https://docs.python.org/3/library/weakref.html#weakref.WeakValueDictionary) for `_instances` so that the instances get automagically removed when they are not used anymore? Imagine a "singleton" for DLL wrappers, where instances can be distinguished by path to DLL. – astafan8 Mar 07 '19 at 13:28
  • I think you can get the same effect by defining a base class `BaseSingleton(metaclass=Singleton)` and then using `Logger(BaseSingleton)`. One possible advantage is everything I need defined with `BaseSingleton`, rather than having both a base class and a metaclass. Does this make sense? – M Juckes Apr 06 '21 at 13:49
  • I found singleton useful when creating module for `Syllogism`. I mean python `bool` are already a singleton. – Inyoung Kim 김인영 May 26 '21 at 11:14
108
class Foo(object):
     pass

some_global_variable = Foo()

Modules are imported only once, everything else is overthinking. Don't use singletons and try not to use globals.

Cat Plus Plus
  • 113,388
  • 26
  • 185
  • 215
  • 26
    why did you say "Don't use singletons"? Any reason? – Alcott Sep 20 '11 at 01:30
  • 4
    This won't work if the singleton has to be pickled. Using the example you gave: `s = some_global_variable; str = pickle.dumps(s); s1 = pickle.loads(str); print s is s1; # False` – dividebyzero Jan 20 '12 at 11:47
  • 7
    @dividebyzero: the `is` operator tests for pointer equality. I would be rather surprised---to the point of calling it a bug---if `pickle.loads` returned a reference to a pre-existing object rather than a reference to a newly created one. Thus, testing whether `s is s1` doesn't tell you anything about the suitability of using modules as singletons. – Jonas Kölker Feb 17 '14 at 10:52
  • 1
    @JonasKölker `pickle.loads()` does do that already, e.g. for instances of `bool` and `NoneType`. `pickle.loads(pickle.dumps(False)) is False` yields `True` – Dan Passaro Apr 28 '14 at 17:16
  • 3
    @leo-the-manic: fair point; however, that's just a side effect of Python interning the objects `True`, `False` and `None`, and has nothing to do with the code behind `pickle.loads`. Also, it's safe to do only for read-only objects. If `pickle.loads` were to return a reference to an already existing *modifiable* object—such as a module—that would be a bug. (And so I'm standing by my implication that dividebyzero's code example doesn't prove anything.) – Jonas Kölker May 03 '14 at 00:18
  • @Cat Plus Plus I think this will significantly increase the import time of the module. It is always better lazy create the object, when required. – deepak Jun 21 '16 at 11:25
  • 2
    This only works if all the imports happen the same way. `import project.module` and `import .module` will run the code twice. – Jan DB Oct 11 '17 at 12:19
  • 1
    If some_global_variable is used in some_module.py and that was the module under test, would mocking some_global_variable be possible? – Naveen Apr 24 '18 at 04:07
  • 2
    should `Foo` be `__Foo` so that users won't casually just use that? – joel Aug 04 '19 at 11:30
  • This should have been the accepted answer given the specifics of this question. Notably, this is exactly the way the actual Python standard library implements the logging module. See the code: https://github.com/python/cpython/blob/master/Lib/logging/__init__.py. And it's still configurable, which seems to be why the original asker didn't want globals initialized at module import time. – Adam Acosta Jan 02 '21 at 21:21
  • This is a very ambiguous answer, may I suggest re-editing it completely in light of the discussion. – matanster Mar 01 '21 at 09:26
74

Use a module. It is imported only once. Define some global variables in it - they will be singleton's 'attributes'. Add some functions - the singleton's 'methods'.

warvariuc
  • 50,202
  • 34
  • 156
  • 216
  • 11
    So what you end up with is... Not a class. You can't use it as a class, you can't base other classes upon it, you use import syntax, and all of a sudden you lose all the benefits of OOP... – theheadofabroom Jul 25 '11 at 13:04
  • 20
    if you can base other classes on it, then it might not be a singleton. you could create one of the derived class, but also one of the base class, but the derived class is also a member of the base, and you have two of the base, which one are you supposed to use? – SingleNegationElimination Jul 25 '11 at 19:32
  • This doesn't work across modules. In my "main" module i set a value. I then reference it in another module and its null. Sigh. – Paul Kenjora Mar 30 '17 at 14:20
  • 1
    @PaulKenjora You must have an error in your code. If you define a global variable in a module, when you access it from another module it should have the value. – warvariuc Mar 30 '17 at 19:40
  • It has the value but when I change it it is not preserved. I ended up using a class with properties in a module that works. Simple types as globals did not work for me ( they lost values as soon as scope changed ). – Paul Kenjora Apr 13 '17 at 18:32
  • 1
    @theheadofabroom you could `import * from base_module`... rethink OOP my friend! hahahah – polvoazul Mar 07 '18 at 04:46
  • 1
    How could you init a singleton object with arguments in a module? – nn0p Jun 10 '19 at 04:51
  • @nn0p pretty old, but you could introduce a third module `config.py` in which you can assign a variable: `import c c.param = 10 import b` b will import c and use c.param and it'll be 10, not ideal for some people but it works – igorgue Sep 23 '20 at 16:35
42

You probably never need a singleton in Python. Just define all your data and functions in a module and you have a de facto singleton:

import datetime
file_name=None

def set_file_name(new_file_name: str):
    global file_name
    file_name=new_file_name

def write(message: str):
    global file_name
    if file_name:
        with open(file_name, 'a+') as f:
            f.write("{} {}\n".format(datetime.datetime.now(), message))
    else:
        print("LOG: {}", message)

To use:

    import log
    log.set_file_name("debug.log")
    log.write("System starting")
    ...

If you really absolutely have to have a singleton class then I'd go with:

    class My_Singleton(object):
        def foo(self):
            pass

    my_singleton = My_Singleton()

To use:

    from mysingleton import my_singleton
    my_singleton.foo()

where mysingleton.py is your filename that My_Singleton is defined in. This works because after the first time a file is imported, Python doesn't re-execute the code.

Alan Dyke
  • 563
  • 4
  • 12
  • 5
    Mostly true, but sometimes that's not enough. E.g. I have a project with a need to log instantiations of many classes at DEBUG level. I need command line options parsed at startup in order to set the user-specified logging level _before_ those classes are instantiated. Module-level instantiations make that problematic. It's possible that I could carefully structure the app so that all of those classes don't get imported until the CLI processing is done, but natural structure of my app is more important than dogmatic adherence to "singletons are bad", since they can be done quite cleanly. – mikenerone Aug 27 '16 at 21:29
  • if you were to test your code while patching my_singleton, would that be possible ? since this my_singleton could be instantiated in some other module. – Naveen Apr 24 '18 at 03:04
  • @Naveen - my_singleton is a single object. If you "patch" it that change will affect all future references, even in other modules. – Alan Dyke Apr 24 '18 at 19:30
  • This might work in some cases, but sometimes lazy initialization is important. In my use case, initialization costs 400ms, so I don't want to incur that just because I imported the module. It has to be incurred only when the singleton is really needed. – joanis Apr 07 '21 at 21:48
  • @joanis. Agreed there is no perfect solution for every possible use case. Maybe, you can still use lazy initialization for the time consuming part of your code, by not putting it into your constructor. Or maybe you need one of the other more complicated suggestions on this page. – Alan Dyke Apr 08 '21 at 16:00
  • Indeed, I've opted for a metaclass-based solution. It did the trick for me. Although it seems to verbose to me. In C++, I've used `X* theX = NULL; X* getTheX() {if (theX == NULL) theX = new X(); return theX;}`. Not very pythonic, but quite a bit shorter. I might switch to that with `None` and `if theX is None` instead, for code that I feel will be easier to read in the future. – joanis Apr 08 '21 at 16:56
11

Here's a one-liner for you:

singleton = lambda c: c()

Here's how you use it:

@singleton
class wat(object):
    def __init__(self): self.x = 1
    def get_x(self): return self.x

assert wat.get_x() == 1

Your object gets instantiated eagerly. This may or may not be what you want.

Jonas Kölker
  • 7,184
  • 2
  • 38
  • 49
  • 6
    -1. This is very bad and silly. You don't define a class to use as an object. You can no longer access the class without being very ugly like `type(wat)` or `wat.__class__`. If you really want to achieve this, better define the class and instantiate it right away, no need to mess up with the decorator. – 0xc0de Oct 16 '14 at 07:56
  • 2
    Why do you need to know use the class of a singleton? Just use the singleton object.. – Tolli Oct 17 '14 at 23:41
  • 1
    It's not [singleton pattern](http://en.wikipedia.org/wiki/Singleton_pattern), so IMO the function should be named differently. – GingerPlusPlus Dec 30 '14 at 21:53
  • 9
    Wikipedia: "the singleton pattern is a design pattern that restricts the instantiation of a class to one object". I would say that my solution does just that. Okay, I guess one could do `wat2 = type(wat)()`, but this is python, we're all consenting adults and all that. You can't *guarantee* that there will be only one instance, but you can guarantee that if people make a second one, it will look ugly and—if they're decent, upstanding people—like a warning sign to them. What am I missing? – Jonas Kölker Jan 02 '15 at 19:35
  • if you are really looking for a one-line solution try a python's module as a singleton, which is actually a zero-line solution. – Sławomir Lenart Apr 05 '21 at 08:54
7

Check out Stack Overflow question Is there a simple, elegant way to define singletons in Python? with several solutions.

I'd strongly recommend to watch Alex Martelli's talks on design patterns in python: part 1 and part 2. In particular, in part 1 he talks about singletons/shared state objects.

Community
  • 1
  • 1
Anton
  • 2,266
  • 14
  • 16
4
  • If one wants to have multiple number of instances of the same class, but only if the args or kwargs are different, one can use the third-party python package Handy Decorators (package decorators).
  • Ex.
    1. If you have a class handling serial communication, and to create an instance you want to send the serial port as an argument, then with traditional approach won't work
    2. Using the above mentioned decorators, one can create multiple instances of the class if the args are different.
    3. For same args, the decorator will return the same instance which is already been created.
>>> from decorators import singleton
>>>
>>> @singleton
... class A:
...     def __init__(self, *args, **kwargs):
...         pass
...
>>>
>>> a = A(name='Siddhesh')
>>> b = A(name='Siddhesh', lname='Sathe')
>>> c = A(name='Siddhesh', lname='Sathe')
>>> a is b  # has to be different
False
>>> b is c  # has to be same
True
>>>
  • A need to make _this_ kind of singleton is what led me to this question. Much appreciated! I tried `pip install handy-decorators` and I get `ERROR: Could not find a version that satisfies the requirement handy-decorators`. Any suggestion? – Ben Kovitz Apr 08 '21 at 16:19
  • I went ahead and copied the source code from [here](https://github.com/siddheshsathe/handy-decorators/blob/38d480711a056512a8bf03724903009e4bef7c11/src/decorators.py#L59) and decorated a dataclass. It worked the first time. Happily, it has no dependencies on any other code! Everything in that module is wonderfully simple and straightforward, truly Pythonic. If you aren't teaching Python, you should be. – Ben Kovitz Apr 08 '21 at 17:09
3

Here's my own implementation of singletons. All you have to do is decorate the class; to get the singleton, you then have to use the Instance method. Here's an example:

   @Singleton
   class Foo:
       def __init__(self):
           print 'Foo created'

   f = Foo() # Error, this isn't how you get the instance of a singleton

   f = Foo.Instance() # Good. Being explicit is in line with the Python Zen
   g = Foo.Instance() # Returns already created instance

   print f is g # True

And here's the code:

class Singleton:
    """
    A non-thread-safe helper class to ease implementing singletons.
    This should be used as a decorator -- not a metaclass -- to the
    class that should be a singleton.

    The decorated class can define one `__init__` function that
    takes only the `self` argument. Other than that, there are
    no restrictions that apply to the decorated class.

    To get the singleton instance, use the `Instance` method. Trying
    to use `__call__` will result in a `TypeError` being raised.

    Limitations: The decorated class cannot be inherited from.

    """

    def __init__(self, decorated):
        self._decorated = decorated

    def Instance(self):
        """
        Returns the singleton instance. Upon its first call, it creates a
        new instance of the decorated class and calls its `__init__` method.
        On all subsequent calls, the already created instance is returned.

        """
        try:
            return self._instance
        except AttributeError:
            self._instance = self._decorated()
            return self._instance

    def __call__(self):
        raise TypeError('Singletons must be accessed through `Instance()`.')

    def __instancecheck__(self, inst):
        return isinstance(inst, self._decorated)
Paul Manta
  • 27,853
  • 27
  • 109
  • 192
  • 2
    It's not true singleton. `SingletonList = Singleton(list).Instance(); print(SingletonList is type(SingletonList)())` should print `True` in true singleton; [with your code prints `False`](http://rextester.com/WIRG69868) – GingerPlusPlus Dec 30 '14 at 22:07
  • @GingerPlusPlus I was aware of a few limitations, but not of the one you pointed out. Thanks for mentioning it. Unfortunately, I don't have time at the moment to thin about a solution to this. – Paul Manta Dec 30 '14 at 22:19
  • I'm giving this answer a –1 based on @GingerPlusPlus's comment. If you ever fix it, let me know and I'll remove the –1. – Ben Kovitz Apr 09 '21 at 17:50
2

Method 3 seems to be very neat, but if you want your program to run in both Python 2 and Python 3, it doesn't work. Even protecting the separate variants with tests for the Python version fails, because the Python 3 version gives a syntax error in Python 2.

Thanks to Mike Watkins: http://mikewatkins.ca/2008/11/29/python-2-and-3-metaclasses/. If you want the program to work in both Python 2 and Python 3, you need to do something like:

class Singleton(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]

MC = Singleton('MC', (object), {})

class MyClass(MC):
    pass    # Code for the class implementation

I presume that 'object' in the assignment needs to be replaced with the 'BaseClass', but I haven't tried that (I have tried code as illustrated).

Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
Tim
  • 21
  • 3
2

I'll toss mine into the ring. It's a simple decorator.

from abc import ABC

def singleton(real_cls):

    class SingletonFactory(ABC):

        instance = None

        def __new__(cls, *args, **kwargs):
            if not cls.instance:
                cls.instance = real_cls(*args, **kwargs)
            return cls.instance

    SingletonFactory.register(real_cls)
    return SingletonFactory

# Usage
@singleton
class YourClass:
    ...  # Your normal implementation, no special requirements.

Benefits I think it has over some of the other solutions:

  • It's clear and concise (to my eye ;D).
  • Its action is completely encapsulated. You don't need to change a single thing about the implementation of YourClass. This includes not needing to use a metaclass for your class (note that the metaclass above is on the factory, not the "real" class).
  • It doesn't rely on monkey-patching anything.
  • It's transparent to callers:
    • Callers still simply import YourClass, it looks like a class (because it is), and they use it normally. No need to adapt callers to a factory function.
    • What YourClass() instantiates is still a true instance of the YourClass you implemented, not a proxy of any kind, so no chance of side effects resulting from that.
    • isinstance(instance, YourClass) and similar operations still work as expected (though this bit does require abc so precludes Python <2.6).

One downside does occur to me: classmethods and staticmethods of the real class are not transparently callable via the factory class hiding it. I've used this rarely enough that I've never happen to run into that need, but it would be easily rectified by using a custom metaclass on the factory that implements __getattr__() to delegate all-ish attribute access to the real class.

A related pattern I've actually found more useful (not that I'm saying these kinds of things are required very often at all) is a "Unique" pattern where instantiating the class with the same arguments results in getting back the same instance. I.e. a "singleton per arguments". The above adapts to this well and becomes even more concise:

def unique(real_cls):

    class UniqueFactory(ABC):

        @functools.lru_cache(None)  # Handy for 3.2+, but use any memoization decorator you like
        def __new__(cls, *args, **kwargs):
            return real_cls(*args, **kwargs)

    UniqueFactory.register(real_cls)
    return UniqueFactory

All that said, I do agree with the general advice that if you think you need one of these things, you really should probably stop for a moment and ask yourself if you really do. 99% of the time, YAGNI.

mikenerone
  • 1,665
  • 3
  • 13
  • 17
2

Using a function attribute is also very simple

def f():
    if not hasattr(f, 'value'):
        setattr(f, 'value', singletonvalue)
    return f.value
Ruben Decrop
  • 1,561
  • 1
  • 14
  • 9
2

I prefer this solution which I found very clear and straightforward. It is using double check for instance, if some other thread already created it. Additional thing to consider is to make sure that deserialization isn't creating any other instances. https://gist.github.com/werediver/4396488

import threading


# Based on tornado.ioloop.IOLoop.instance() approach.
# See https://github.com/facebook/tornado
class SingletonMixin(object):
    __singleton_lock = threading.Lock()
    __singleton_instance = None

    @classmethod
    def instance(cls):
        if not cls.__singleton_instance:
            with cls.__singleton_lock:
                if not cls.__singleton_instance:
                    cls.__singleton_instance = cls()
        return cls.__singleton_instance


if __name__ == '__main__':
    class A(SingletonMixin):
        pass

    class B(SingletonMixin):
        pass

    a, a2 = A.instance(), A.instance()
    b, b2 = B.instance(), B.instance()

    assert a is a2
    assert b is b2
    assert a is not b

    print('a:  %s\na2: %s' % (a, a2))
    print('b:  %s\nb2: %s' % (b, b2))
Andrei R.
  • 76
  • 2
  • Pardon my ignorance, but why do you need to check twice for `__singleton_instance`? Could you not just always take `__singleton_lock` and then only check once? – theheadofabroom Oct 26 '20 at 22:21
  • As I mentioned before, we need it to make sure that, while we are performing 'if' and using the lock, some other thread haven't created this instance already https://en.wikipedia.org/wiki/Double-checked_locking It's a fairly popular concept to be asked at interviews :) – Andrei R. Oct 26 '20 at 22:29
  • But surely the cost of acquiring an uncontested lock is low enough that if it were significant, you would be better off implementing it in C? IIRC the cost of acquiring the lock is about half that of a function call, and so the better optimisation here might be to avoid using the context manager and acquire the lock manually. If this is an unnecessary optimisation I'd argue double checking is even more so. – theheadofabroom Oct 26 '20 at 23:54
  • Double checking is not an optimization, it is to make sure that we don't create two instances of a Singleton. It's also, good to point out that these checks will be executed only once, at the first initialization. After that it is just returning the instance. So any optimizations will be pointless. – Andrei R. Oct 27 '20 at 22:04
  • This is what I don't seem to be getting. Surely as long as you check while holding the lock you only need to check once? That's what the lock is there for, to synchronise access. – theheadofabroom Oct 27 '20 at 22:08
  • Is double checking even needed for python ? that pattern is not about costs or optimization, but about memory model of the environment. The thing is, doesn't the GIL ensures proper locking when the object is being constructed ? There are languages in which the use of the double locking pattern is wrong, as there are reordering, besides, you don't always need it. – Luiz Felipe May 27 '21 at 18:57
1

How about this:

def singleton(cls):
    instance=cls()
    cls.__new__ = cls.__call__= lambda cls: instance
    cls.__init__ = lambda self: None
    return instance

Use it as a decorator on a class that should be a singleton. Like this:

@singleton
class MySingleton:
    #....

This is similar to the singleton = lambda c: c() decorator in another answer. Like the other solution, the only instance has name of the class (MySingleton). However, with this solution you can still "create" instances (actually get the only instance) from the class, by doing MySingleton(). It also prevents you from creating additional instances by doing type(MySingleton)() (that also returns the same instance).

Tolli
  • 352
  • 5
  • 12
  • You don't define a class to use it as an object. – 0xc0de Oct 16 '14 at 08:00
  • 1
    Every time you call `type(MySingleton)()`, `MySingleton.__init__()` gets called and the object gets initialized multiple Times; you can fix it writing `cls.__init__ = lambda self: pass` in your `singleton`. Also, overriding `cls.__call__` seems pointless, and even harmful - `__call__` defined in this context is used when you call `MySingleton(any, list, of, arguments)`, not when you call `type(MySingleton)(any, list, of, arguments)`. – GingerPlusPlus Dec 31 '14 at 13:23
  • @GingerPlusPlus, Thanks for pointing out that `__init__()` gets called again when doing `type(MySingleton)()`. The solution you proposed (adding `cls.__init__ = lambda self: pass`) give a syntax error, because the last part of the lambda expression needs to be an expression, not a statement. However, adding `cls.__init__ = lambda self: None` works, so I added that to my answer. – Tolli Jan 02 '15 at 05:42
  • 1
    @GingerPlusPlus, Regarding the use of `__call__`. my intention was to make both `type(MySingleton)()` and `MySingleton()` return the instance. So it is doing what I wanted. You can think of MySingleton as either the type of the singleton or the instance of the singleton (or both). – Tolli Jan 02 '15 at 05:43
1

Well, other than agreeing with the general Pythonic suggestion on having module-level global, how about this:

def singleton(class_):
    class class_w(class_):
        _instance = None
        def __new__(class2, *args, **kwargs):
            if class_w._instance is None:
                class_w._instance = super(class_w, class2).__new__(class2, *args, **kwargs)
                class_w._instance._sealed = False
            return class_w._instance
        def __init__(self, *args, **kwargs):
            if self._sealed:
                return
            super(class_w, self).__init__(*args, **kwargs)
            self._sealed = True
    class_w.__name__ = class_.__name__
    return class_w

@singleton
class MyClass(object):
    def __init__(self, text):
        print text
    @classmethod
    def name(class_):
        print class_.__name__

x = MyClass(111)
x.name()
y = MyClass(222)
print id(x) == id(y)

Output is:

111     # the __init__ is called only on the 1st time
MyClass # the __name__ is preserved
True    # this is actually the same instance
Guard
  • 6,308
  • 2
  • 35
  • 55
  • What is the point of the `_sealed` attribute? As far as I see this doesn't do anything? Something is niggling me about this that says it shouldn't perform well... I'll run some comparative tests later this week. – theheadofabroom Jul 25 '11 at 10:32
  • _sealed ensures your __init__ is ran only once; I don't see any point why it should perform worse than the regular function-like decorator - the function is executed only once per class, and returns a new inherited class – Guard Jul 25 '11 at 19:29
  • BTW, your edit contains tabs that break the indents You also say 'we are creating 2 classes' - do you mean that we are creating '1 extra class'? – Guard Jul 25 '11 at 19:31
  • Yes one extra class is what I meant. I intend to include stuff in `__init__` to be called every time it's initialised. Just a simple 'Being initialised in class.method'. as for indentation - you used tabs and spaces - I fixed most of it, but seem to have missed one if you want to get it (just check the edit log) – theheadofabroom Jul 26 '11 at 06:33
  • re __init__: of course it's up to you, I just tried to mimic the singleton behavior in other languages, where constructor code (which is not exactly __init__, but very close in its sense) is only called once if you want the __init__ to be called every time, just kill all references to _sealed re spaces / tabs - well, then my emacs needs fixing. anyway, above is the corrected version – Guard Jul 26 '11 at 06:52
  • @Guard I commented on your method in my post. Basically, the class shouldn't need to know / care it's a singleton. It should be able to customize `__new__` and safely call `super()` -- which your method doesn't allow, as calling `super()` on a method of the same name will recurse. – agf Jul 27 '11 at 05:20
  • @agf, I think you are a bit exaggerating about names related to the inheritance chain: https://gist.github.com/1108823 We are just altering it's string name, not a class variable – Guard Jul 27 '11 at 06:59
  • It's not the name of the class that matters. Try your own code: have `MyClass.__init__(text)` call `super(MyClass, self).__init__(text)` or add `MyClass.__new__(cls)` method and have it call `return super(self, MyClass).__new__(cls)`. You'll recurse infinitely. – agf Jul 27 '11 at 07:23
  • @agf Could you explain why `super(MyClass, self).__init__(text)` recurses? As I understand, `super(MyClass, self)` should be `object`. – ovgolovin Aug 04 '12 at 20:33
  • @agf I made a special question for that: http://stackoverflow.com/questions/11811935/why-a-recursion-happens-here – ovgolovin Aug 04 '12 at 20:57
0

Code based on Tolli's answer.

#decorator, modyfies new_cls
def _singleton(new_cls):
    instance = new_cls()                                              #2
    def new(cls):
        if isinstance(instance, cls):                                 #4
            return instance
        else:
            raise TypeError("I can only return instance of {}, caller wanted {}".format(new_cls, cls))
    new_cls.__new__  = new                                            #3
    new_cls.__init__ = lambda self: None                              #5
    return new_cls


#decorator, creates new class
def singleton(cls):
    new_cls = type('singleton({})'.format(cls.__name__), (cls,), {} ) #1
    return _singleton(new_cls)


#metaclass
def meta_singleton(name, bases, attrs):
    new_cls = type(name, bases, attrs)                                #1
    return _singleton(new_cls)

Explanation:

  1. Create new class, inheriting from given cls
    (it doesn't modify cls in case someone wants for example singleton(list))

  2. Create instance. Before overriding __new__ it's so easy.

  3. Now, when we have easily created instance, overrides __new__ using method defined moment ago.
  4. The function returns instance only when it's what the caller expects, otherwise raises TypeError.
    The condition is not met when someone attempts to inherit from decorated class.

  5. If __new__() returns an instance of cls, then the new instance’s __init__() method will be invoked like __init__(self[, ...]), where self is the new instance and the remaining arguments are the same as were passed to __new__().

    instance is already initialized, so function replaces __init__ with function doing nothing.

See it working online

Community
  • 1
  • 1
GingerPlusPlus
  • 4,634
  • 1
  • 24
  • 47
0

It is slightly similar to the answer by fab but not exactly the same.

The singleton contract does not require that we be able to call the constructor multiple times. As a singleton should be created once and once only, shouldn't it be seen to be created just once? "Spoofing" the constructor arguably impairs legibility.

So my suggestion is just this:

class Elvis():
    def __init__(self):
        if hasattr(self.__class__, 'instance'):
            raise Exception()
        self.__class__.instance = self
        # initialisation code...

    @staticmethod
    def the():
        if hasattr(Elvis, 'instance'):
            return Elvis.instance
        return Elvis()

This does not rule out the use of the constructor or the field instance by user code:

if Elvis() is King.instance:

... if you know for sure that Elvis has not yet been created, and that King has.

But it encourages users to use the the method universally:

Elvis.the().leave(Building.the())

To make this complete you could also override __delattr__() to raise an Exception if an attempt is made to delete instance, and override __del__() so that it raises an Exception (unless we know the program is ending...)

Further improvements


My thanks to those who have helped with comments and edits, of which more are welcome. While I use Jython, this should work more generally, and be thread-safe.

try:
    # This is jython-specific
    from synchronize import make_synchronized
except ImportError:
    # This should work across different python implementations
    def make_synchronized(func):
        import threading
        func.__lock__ = threading.Lock()

        def synced_func(*args, **kws):
            with func.__lock__:
                return func(*args, **kws)

        return synced_func

class Elvis(object): # NB must be subclass of object to use __new__
    instance = None

    @classmethod
    @make_synchronized
    def __new__(cls, *args, **kwargs):
        if cls.instance is not None:
            raise Exception()
        cls.instance = object.__new__(cls, *args, **kwargs)
        return cls.instance

    def __init__(self):
        pass
        # initialisation code...

    @classmethod
    @make_synchronized
    def the(cls):
        if cls.instance is not None:
            return cls.instance
        return cls()

Points of note:

  1. If you don't subclass from object in python2.x you will get an old-style class, which does not use __new__
  2. When decorating __new__ you must decorate with @classmethod or __new__ will be an unbound instance method
  3. This could possibly be improved by way of use of a metaclass, as this would allow you to make the a class-level property, possibly renaming it to instance
mike rodent
  • 10,479
  • 10
  • 80
  • 104
  • While this is a slightly different interpretation of the singleton pattern, I'm pretty sure it's still valid, although I might be tempted to use `__new`__ rather than `__init__`, as it purely acts on class attributes and this prevents there from briefly being a second instance. The difference then between this and method 2, is whether trying to initialise more than once returns the single instance or raises an exception. I think I'm happy that either satisfy the singleton pattern, one is easier to use, while the other is more explicit that it is a singleton. – theheadofabroom Feb 21 '16 at 09:40
  • Obviously use of the class name in `__init__` prevents subclassing, but while this makes things easier, it's not required – theheadofabroom Feb 21 '16 at 09:43
  • Thanks... ah yes, a momentary second instance before the Exception gets thrown. I have modified the `__init__` so that hopefully this should be subclassable... – mike rodent Feb 21 '16 at 09:51
  • Cool, `the` could probably benefit from being a class method for similar reasons – theheadofabroom Feb 21 '16 at 10:32
  • yes, you're right. Then you can have a SuperElvis subclass singleton and (for example) an ImaginaryElvis subclass singleton... and they can co-exist. See additional thoughts. Please feel free to improve my code. – mike rodent Feb 21 '16 at 11:35
  • Thanks for the code improvements. Just one minor quibble/doubt: making `instance` a class field like this means that `King.instance` evaluates to None before the singleton is created, rather than raising a "no attribute" exception... Never mind though. Arguably more desirable: I don't know what reasoning to apply... – mike rodent Feb 22 '16 at 18:09
  • oops, also had to tweak your `the` version to reflect use of class field – mike rodent Feb 22 '16 at 18:22
  • 2017-12-23 downvote... please have the courtesy to add a comment to explain your thinking: it might be helpful to me, or you might find that *you* learn something – mike rodent Dec 23 '17 at 08:20
0

One liner (I am not proud, but it does the job):

class Myclass:
  def __init__(self):
      # do your stuff
      globals()[type(self).__name__] = lambda: self # singletonify
polvoazul
  • 933
  • 1
  • 8
  • 22
  • This may do the job as long as your class hasn't been imported into any other modules... – Aran-Fey Oct 24 '18 at 12:41
  • True. If you can pay the cost of initing the class you can run a Myclass() immediately after the class definition to avoid this. – polvoazul Oct 26 '18 at 14:56
0

If you don't need lazy initialization of the instance of the Singleton, then the following should be easy and thread-safe:

class A:
    instance = None
    # Methods and variables of the class/object A follow
A.instance = A()

This way A is a singleton initialized at module import.

Serge Rogatch
  • 11,119
  • 4
  • 58
  • 117
0

Maybe I missunderstand the singleton pattern but my solution is this simple and pragmatic (pythonic?). This code fullfills two goals

  1. Make the instance of Foo accessiable everywhere (global).
  2. Only one instance of Foo can exist.

This is the code.

#!/usr/bin/env python3

class Foo:
    me = None

    def __init__(self):
        if Foo.me != None:
            raise Exception('Instance of Foo still exists!')

        Foo.me = self


if __name__ == '__main__':
    Foo()
    Foo()

Output

Traceback (most recent call last):
  File "./x.py", line 15, in <module>
    Foo()
  File "./x.py", line 8, in __init__
    raise Exception('Instance of Foo still exists!')
Exception: Instance of Foo still exists!
0

After struggling with this for some time I eventually came up with the following, so that the config object would only be loaded once, when called up from separate modules. The metaclass allows a global class instance to be stored in the builtins dict, which at present appears to be the neatest way of storing a proper program global.

import builtins

# -----------------------------------------------------------------------------
# So..... you would expect that a class would be "global" in scope, however
#   when different modules use this,
#   EACH ONE effectively has its own class namespace.  
#   In order to get around this, we use a metaclass to intercept
#   "new" and provide the "truly global metaclass instance" if it already exists

class MetaConfig(type):
    def __new__(cls, name, bases, dct):
        try:
            class_inst = builtins.CONFIG_singleton

        except AttributeError:
            class_inst = super().__new__(cls, name, bases, dct)
            builtins.CONFIG_singleton = class_inst
            class_inst.do_load()

        return class_inst

# -----------------------------------------------------------------------------

class Config(metaclass=MetaConfig):

    config_attr = None

    @classmethod
    def do_load(cls):
        ...<load-cfg-from-file>...
Den-Jason
  • 1,388
  • 12
  • 11
0

I will recommend an elegant solution using metaclasses

class Singleton(type): 
    # Inherit from "type" in order to gain access to method __call__
    def __init__(self, *args, **kwargs):
        self.__instance = None # Create a variable to store the object reference
        super().__init__(*args, **kwargs)

    def __call__(self, *args, **kwargs):
        if self.__instance is None:
            # if the object has not already been created
            self.__instance = super().__call__(*args, **kwargs) # Call the __init__ method of the subclass (Spam) and save the reference
            return self.__instance
        else:
            # if object (Spam) reference already exists; return it
            return self.__instance

class Spam(metaclass=Singleton):
    def __init__(self, x):
        print('Creating Spam')
        self.x = x


if __name__ == '__main__':
    spam = Spam(100)
    spam2 = Spam(200)

Output:

Creating Spam

As you can see from the output, only one object is instantiated

Dorcioman
  • 107
  • 1
  • 3
0

I also prefer decorator syntax to deriving from metaclass. My two cents:

from typing import Callable, Dict, Set


def singleton(cls_: Callable) -> type:
    """ Implements a simple singleton decorator
    """
    class Singleton(cls_):  # type: ignore
        __instances: Dict[type, object] = {}
        __initialized: Set[type] = set()

        def __new__(cls, *args, **kwargs):
            if Singleton.__instances.get(cls) is None:
                Singleton.__instances[cls] = super().__new__(cls, *args, **kwargs)
            return Singleton.__instances[cls]

        def __init__(self, *args, **kwargs):
            if self.__class__ not in Singleton.__initialized:
                Singleton.__initialized.add(self.__class__)
                super().__init__(*args, **kwargs)

    return Singleton


@singleton
class MyClass(...):
    ...

This has some benefits above other decorators provided:

  • isinstance(MyClass(), MyClass) will still work (returning a function from the clausure instead of a class will make isinstance to fail)
  • property, classmethod and staticmethod will still work as expected
  • __init__() constructor is executed only once
  • You can inherit from your decorated class (useless?) using @singleton again

Cons:

  • print(MyClass().__class__.__name__) will return Singleton instead od MyClass. If you still need this, I recommend using a metaclass as suggested above.

If you need a different instance based on constructor parameters this solution needs to be improved (solution provided by siddhesh-suhas-sathe provides this).

Finally, as other suggested, consider using a module in python. Modules are objects. You can even pass them in variables and inject them in other classes.

Boriel
  • 111
  • 1
  • 6
0

Pros

It's a true class Auto-magically covers inheritance Uses metaclass for its proper purpose (and made me aware of it) Cons

Are there any?

This will be problem with serialziation. If you try to deserialize object from file (pickle) it will not use __call__ so it will create new file, you can use base class inheritance with __new__ to prevent that.

Vintage
  • 21
  • 6
0

You can use a metaclass if you want to use instance as a property. For example;

class SingletonMeta(type):
    def __init__(cls, *args, **kwargs):
        super().__init__(*args, **kwargs)
        cls._instance = None
        cls._locker = threading.Lock()

    @property
    def instance(self, *args, **kwargs):
        if self._instance is None:
            with self._locker:
                if self._instance is None:
                    self._instance = self(*args, **kwargs)
        return self._instance


class MyClass(metaclass=SingletonMeta):
    def __init__(self):
        # init here
        pass


# get the instance
my_class_instance = MyClass.instance
omerfarukdogan
  • 799
  • 8
  • 25
-1

I can't remember where I found this solution, but I find it to be the most 'elegant' from my non-Python-expert point of view:

class SomeSingleton(dict):
    __instance__ = None
    def __new__(cls, *args,**kwargs):
        if SomeSingleton.__instance__ is None:
            SomeSingleton.__instance__ = dict.__new__(cls)
        return SomeSingleton.__instance__

    def __init__(self):
        pass

    def some_func(self,arg):
        pass

Why do I like this? No decorators, no meta classes, no multiple inheritance...and if you decide you don't want it to be a Singleton anymore, just delete the __new__ method. As I am new to Python (and OOP in general) I expect someone will set me straight about why this is a terrible approach?

2cynykyl
  • 813
  • 8
  • 12
  • 2
    _why this is a terrible approach?_ when you want create another singleton class, you have to copy & paste the `__new__`. [Don't repeat yourself](http://en.wikipedia.org/wiki/Don%27t_repeat_yourself). – GingerPlusPlus Dec 30 '14 at 17:56
  • Also, why your new takes `*args` and `**kwargs`, and then does nothing with them? Pass them into `dict.__new__` this way: `dict.__new__(cls, *args, **kwargs)`. – GingerPlusPlus Dec 31 '14 at 13:29
  • This will call the `__init__` method every time the class is called. If your `__init__` method actually did something, you'd notice the problem. Whenever you do `SomeSingleton()`, your singleton's state is reset by the `__init__` method. – Aran-Fey Oct 24 '18 at 12:45
-1

This answer is likely not what you're looking for. I wanted a singleton in the sense that only that object had its identity, for comparison to. In my case it was being used as a Sentinel Value. To which the answer is very simple, make any object mything = object() and by python's nature, only that thing will have its identity.

#!python
MyNone = object()  # The singleton

for item in my_list:
    if item is MyNone:  # An Example identity comparison
        raise StopIteration
ThorSummoner
  • 12,194
  • 11
  • 114
  • 129
  • I have learned that modules can actually be imported multiple times, in such case this is only a local singleton, which isn't really a singleton in any capacity. – ThorSummoner Mar 23 '18 at 20:00
  • Can you elaborate on how a module can be imported multiple times? The only time I have seen that is when an exception occurs while the module is loaded, the user may still load the module later, yet the side effects will have occurred already, so some actions may be executed a second time. – sleblanc Mar 16 '19 at 15:25
  • Once a module has been fully loaded, I don't see a way to have this module run again, other than by coercing the interpreter into doing it using `eval` or `importlib.reload`. – sleblanc Mar 16 '19 at 15:29
  • @sleblanc I thought I had an SO post on the topic, couldn't find it; here is a top google result: https://stackoverflow.com/a/55910681/1695680 IIRC I needed this to monkey patch some incorrect behavior in python's stdlib's ssl certificate chain of trust assertions when multiple domains were used in a particular way, allowing some modules to have their ssl interfaces replaced with the monkeypatched version and others to not, and being able to swap them as needed. I do not recommend monkey patching, but I'm sure glad the option exists :) – ThorSummoner Nov 01 '20 at 20:15
-3

This solution causes some namespace pollution at the module level (three definitions rather than just one), but I find it easy to follow.

I'd like to be able to write something like this (lazy initialization), but unfortunately classes are not available in the body of their own definitions.

# wouldn't it be nice if we could do this?
class Foo(object):
    instance = None

    def __new__(cls):
        if cls.instance is None:
            cls.instance = object()
            cls.instance.__class__ = Foo
        return cls.instance

Since that isn't possible, we can break out the initialization and the static instance in

Eager Initialization:

import random


class FooMaker(object):
    def __init__(self, *args):
        self._count = random.random()
        self._args = args


class Foo(object):
    def __new__(self):
        return foo_instance


foo_instance = FooMaker()
foo_instance.__class__ = Foo

Lazy initialization:

Eager Initialization:

import random


class FooMaker(object):
    def __init__(self, *args):
        self._count = random.random()
        self._args = args


class Foo(object):
    def __new__(self):
        global foo_instance
        if foo_instance is None:
            foo_instance = FooMaker()
        return foo_instance


foo_instance = None
Gregory Nisbet
  • 5,950
  • 3
  • 21
  • 50