如何使单例继承具有预定义值的常规类,并且可以通过“ is”进行比较,而无需使用圆括号?

维普

我的尝试是从元类内部创建默认实例,但无济于事。在下面的示例中,至少报告的类是单例。

编辑:在这里澄清要求:通过使用is关键字而不是实例化/调用它的单例可比不幸的是,这里的这个众所周知的问题似乎并未解决。

class MyNormalClass:
    def __init__(self, values):
        self.values = values


class MySingleton(MyNormalClass, type):
    def __new__(mcs, *args, **kwargs):
        return MyNormalClass(["default"])


print(MySingleton)
# <class '__main__.MySingleton'>

print(MySingleton.values)
# AttributeError: type object 'MySingleton' has no attribute 'values'
布宜诺斯艾利斯

单身人士的元类是过大的。(搜索我的答案,这个短语应该出现10次左右)。

在问题的示例代码中,类和元类方法中的代码甚至没有运行,甚至没有运行一次。Python中没有黑魔法-程序仅运行,并且有一些标记有特殊方法__xx__,这些语言将在语言运行时内部调用。在这种情况下,__new__只要您将新类用作元类创建新的类,该元类就会被调用,您的代码不会显示。并且,每次使用“单身”类时,它都会创建一个新实例。

在这种情况下,如果您只需要一个实例,则只需创建该实例,然后将该实例设为公共实例,而不是其类即可。您甚至可以使用实例本身来隐藏模块命名空间中的类,因此没有人可以意外地再次实例化它。好吧,如果您希望值是不可变的,则不能确保以任何方式使用纯Python代码,但可以使更改值不能随便使用,=以使人们知道他们不应该更改它:


class MySingleton:
    __slots__ = ("values",)
    def __init__(self, values):
        self.values = values
        def lock(self, name, value):
             raise TypeError("Singleton can't change value")
        self.__class__.__setitem__ = lock



MySingleton = MySingleton(["values"])

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档