gpt4 book ai didi

python - 使用python中的构造函数限制在单例类中创建对象

转载 作者:太空宇宙 更新时间:2023-11-04 04:13:44 24 4
gpt4 key购买 nike

我正在为 python 中的一项要求编写单例类。我可以意识到我无法限制该类的对象创建,如果某些客户端在使用单例类方法(意味着返回该类的唯一实例的方法)之前首先使用构造函数进行调用。

这是什么意思?让我用一些代码片段来解释这一点。考虑一下我有以下示例之一:


import threading
class MyClass:

__instance = None

def __init__(self):

if self.__instance:
raise ValueError("Already exist")


@classmethod
def getInstance(cls):

lock = threading.Lock()

with lock:
if cls.__instance == None:
cls.__instance = MyClass()
return cls.__instance

def printObjInfo(self,obj):
print(id(obj))


if __name__ == '__main__':

ob4 = MyClass()
ob4.printObjInfo(ob4)

obj1 = MyClass.getInstance()
obj1.printObjInfo(obj1)

obj2 = MyClass.getInstance()
obj2.printObjInfo(obj2)

# Create a thread
obj3 = MyClass.getInstance()
obj3.printObjInfo(obj3)
t1 = threading.Thread(target=obj3.printObjInfo, args=(obj3))

如果我运行上面的代码片段,我会得到如下结果:

44824952 - Object created by constructor.
44826240 - Object created by getInstance() method.
44826240 - Object created by getInstance() method.
44826240 - Object created by getInstance() method.

需要注意的一件事 - 如果有人在调用 getInstance() 方法后调用构造函数,那么我们可以轻松地限制其他对象的创建。但如果它首先被调用,那么我们将无法控制它。

现在的问题是 - 1) 我不能在 __init__() 中放置任何进一步的条件来防止任何人调用它或 2) 不能将我的构造函数设为私有(private) - 可以吗?

我在这里找到了一些引用 - Program to restrict object creation in Python但不确定,我们如何限制第一个对象的创建本身。有没有更好的方法让您做到这一点?

有什么想法或引用吗?

谢谢。

最佳答案

您可以改写 __new__:

class Singleton:

_instance = None

def __init__(self, arg):
self.arg = arg

def __new__(cls, arg):
if cls._instance is None:
cls._instance = object.__new__(cls)
return cls._instance

else:
return cls._instance

print(Singleton(None))
print(Singleton(None))
print(Singleton(None))

输出:

<__main__.Singleton object at 0x1207fa550>
<__main__.Singleton object at 0x1207fa550>
<__main__.Singleton object at 0x1207fa550>

这样做的好处是有一个统一的接口(interface)来创建和获取单例的单个实例:构造函数。

请注意,除非您编写自己的 C 扩展或类似的东西,否则您将永远无法在 Python 中创建真正的单例:

print(object.__new__(Singleton))
print(object.__new__(Singleton))
print(object.__new__(Singleton))

输出:

<__main__.Singleton object at 0x120806ac8>
<__main__.Singleton object at 0x1207d5b38>
<__main__.Singleton object at 0x1207d5198>

关于python - 使用python中的构造函数限制在单例类中创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55860871/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com