| from __future__ import print_function |
| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| |
| import logging as log |
| |
| |
| 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. Also, the decorated class cannot be |
| inherited from. 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. |
| |
| """ |
| |
| def __init__(self, decorated): |
| self._decorated = decorated |
| |
| def getInstance(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 `getInstance()`.') |
| |
| def __instancecheck__(self, inst): |
| return isinstance(inst, self._decorated) |