Python 通过继承创建单例对象
# -*- coding = utf-8 -*-
# @Time : 2022/7/6 19:21
# @Author : Suage
# @File : 单例父类.py
import warnings
class SingleWarning(Warning): pass
class Single:
"""Extends this class to create a single instance"""
__instances = {}
def __new__(cls, *args, **kwargs):
__i = cls.__instances.get(cls.__name__)
if __i is None:
__i = super().__new__(cls)
__i.on_init(*args, **kwargs)
cls.__instances[cls.__name__] = __i
else:
if args or kwargs:
warm_msg = "Instance is already created, initialize function will not be call."
warnings.warn(warm_msg, SingleWarning)
return __i
def on_init(self, *args, **kwargs):
"""Overwrite this method to initialize the instance."""
pass
class SubSingle1(Single):
def on_init(self, *args, **kwargs):
self.a = 5
class SubSingle2(Single):
def on_init(self, name):
self.name = name
self.b = 6
if __name__ == '__main__':
s0 = Single()
s1_1 = SubSingle1()
s1_2 = SubSingle1()
s2_1 = SubSingle2('Suage')
s2_2 = SubSingle2('Tom')
print(f's0=s1_1: {s0 == s1_1}')
print(f's1_1=s1_2: {s1_1 == s1_2}')
print(f's1_1=s2: {s1_1 == s2_1}')
s1_1.val = 1
print(s1_2.val)
'''
s0=s1_1: False
s1_1=s1_2: True
s1_1=s2: False
1
D:\Tool\单例父类.py:24: SingleWarning: Instance is already created, initialize function will not be call.
warnings.warn(warm_msg, SingleWarning)
'''