I'm trying to use a class decorator to achieve a singleton pattern as below:
python3.6+
def single_class(cls): cls._instance = None origin_new = cls.__new__ # @staticmethod # why staticmethod decorator is not needed here? def new_(cls, *args, **kwargs): if cls._instance: return cls._instance cls._instance = cv = origin_new(cls) return cv cls.__new__ = new_ return cls @single_class class A(): ... a = A() b = A() print(a is b ) # True The singleton pattern seems to be working well, but I'm wondering why @staticmethod is not needed above the function new_ in my code, as I know that cls.__new__ is a static method.
class object: """ The most base type """ ... @staticmethod # known case of __new__ def __new__(cls, *more): # known special case of object.__new__ """ Create and return a new object. See help(type) for accurate signature. """ pass ... Update test with
python2.7+
The @staticmethod seems to be needed in py2 and not needed in py3
def single_class(cls): cls._instance = None origin_new = cls.__new__ # @staticmethod # without @staticmethod there will be a TypeError # and work fine with @staticmethod adding def new_(cls, *args, **kwargs): if cls._instance: return cls._instance cls._instance = cv = origin_new(cls) return cv cls.__new__ = new_ return cls @single_class class A(object): pass a = A() b = A() print(a is b ) # TypeError: unbound method new_() must be called with A instance as the first argument (got type instance instead)