我需要创建一个像 Singleton 一样工作的类,并且应该从基类继承。可以有几个类,如 MyClass。
最后,我想出了以下解决方案:
import random
class Singleton(object):
_instances = {}
def __new__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls._instances[cls]
class BaseClass(object):
def __init__(self, data):
self.value = random.random()
self.data = data
def asfaa(self):
pass
class MyClass(BaseClass, Singleton):
def __init__(self, data=3):
super().__init__(data)
self.a = random.random()
class MyClass1(BaseClass, Singleton):
def __init__(self, data=3):
super().__init__(data)
self.a = random.random()
inst1 = MyClass(3)
inst2 = MyClass(5)
如果 def __init__(self, data=3)MyClass 不接受任何参数并且看起来像这样,那么一切都会正常工作:def __init__(self)
如果我__init__在上面的示例中提供参数,那么我会收到以下错误。
line 9, in __new__
cls._instances[cls] = super(Singleton, cls).__new__(cls, *args, **kwargs)
TypeError: object.__new__() takes exactly one argument (the type to instantiate)
您如何将参数传递给 MyClass 等?有什么问题?
在splash58的回答之后,我们设法得到了这个工作结果:
import random
class Singleton(object):
_instances = {}
def __new__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__new__(cls)
return cls._instances[cls]
class BaseClass(object):
def __init__(self, data: int):
self.value = random.random()
self.data = data
def asfaa(self):
pass
class MyClass(BaseClass, Singleton):
def __init__(self, data=0):
if not hasattr(self, '_is_initialized'):
super().__init__(data)
self.a = random.random()
self._is_initialized = True
class MyClass1(BaseClass, Singleton):
def __init__(self, data=0):
if not hasattr(self, '_is_initialized'):
super().__init__(data)
self.a = random.random()
self._is_initialized = True
inst = MyClass(1)
print(inst, inst.a, inst.data)
inst1 = MyClass(1234)
print(inst1, inst1.a, inst1.data)
inst2 = MyClass1(123)
print(inst2, inst2.a, inst2.data)
执行结果:
<__main__.MyClass object at 0x7fd702199890> 0.40160478301994584 1
<__main__.MyClass object at 0x7fd702199890> 0.40160478301994584 1
<__main__.MyClass1 object at 0x7fd7021998d0> 0.6368002566047511 123