【发布时间】:2023-03-03 04:53:23
【问题描述】:
我在 python 中使用了单例的装饰器,实现如下所示。
我想让装饰类的 pydoc 与非装饰类的 pydoc 完全相同,但我不知道如何:
没有
getSingletonInstance.__doc__ = cls.__doc__这一行,装饰类的pydoc给出singleton函数的pydoc。使用
getSingletonInstance.__doc__ = cls.__doc__行,装饰类的 pydoc 只给出“顶级”文档字符串。
我该如何继续?
谢谢。
def singleton(cls):
"""A singleton decorator
Warnings
--------
Singleton gdecorated calsses cannot be inhehited
Example
-------
>>> from decorators import singleton
>>> @singleton
... class SingletonDemo():
... pass
>>> d1 = SingletonDemo()
>>> d1.a = 0xCAFE
>>> d2 = SingletonDemo()
>>> id(d1) == id(d2)
True
>>> d1 == d2
True
>>> d2.a == 0xCAFE
True
References
----------
See case 2 of https://www.python.org/dev/peps/pep-0318/#examples
"""
_instances = {}
def getSingletonInstance():
if cls not in _instances:
_instances[cls] = cls()
return _instances[cls]
getSingletonInstance.__doc__ = cls.__doc__
return getSingletonInstance
【问题讨论】:
-
不不不不不不不。永远不要编写用函数替换类的装饰器。
type(SingletonDemo()) is SingletonDemo?False。isinstance(SingletonDemo(), SingletonDemo)?TypeError。class SingletonSubclass(SingletonDemo):?还有TypeError。当你装饰一个类时,返回一个类。理想情况下,同一个班级。 -
感谢 Aran-Fey,但是……好吧,我已经看到了很多关于单身人士的想法,但没有一个是完美的。蟒蛇宣言说:“尽管实用性胜过纯洁性。”。但是,如果您有更好的解决方案,我会很乐意学习 ;-) 我只是不想在每次需要实例时都调用
getInstance类方法或类似的方法,但我想总是能够透明地使用MyClass()。 -
为什么不直接将实例设为模块级全局,并防止创建更多实例?您可能熟悉核心 Python 单例
None,但您从未通过调用构造函数访问过它。你只需写None。 -
确实是@user2357112,但这意味着每次导入模块时都会创建实例。如果不需要,我不想创建实例。
标签: python python-3.x decorator docstring