5

我有一个使用 Python 2.6 的基本 Monostate。

class Borg(object):
    __shared_state = {}
    def __new__(cls, *args, **kwargs):
        self = object.__new__(cls, *args, **kwargs)
        self.__dict__ = cls.__shared_state
        return self

    def __init__(self, *args, **kwargs):
        noSend = kwargs.get("noSend", False)
        reportLevel = kwargs.get("reportLevel", 30)
        reportMethods = kwargs.get("reportMethods", "BaseReport")
        contacts= kwargs.get("contacts", None)

a = Borg(contacts="Foo", noSend="Bar", )

这很高兴给了我以下弃用警告..

untitled:4: DeprecationWarning: object.__new__() takes no parameters
  self = object.__new__(cls, *args, **kwargs)

经过一番谷歌搜索,我发现这是附加到Bug #1683368。我不明白这是什么意思。它抱怨以下行

self = object.__new__(cls, *args, **kwargs)

这似乎没问题。有人可以用外行的方式解释为什么这是一个问题。我知道“这与其他内置程序不一致,例如列表”,但我不确定我理解为什么。有人会解释这个告诉我正确的方法吗?

谢谢

4

2 回答 2

6

请参阅python-singleton-object-instantiation,并注意Alex Martelli 的单例示例:

class Singleton(object):

    __instance = None

    def __new__(cls):
        if cls.__instance == None:
            __instance = type.__new__(cls)
            __instance.name = "The one"
        return __instance

Guido 回答了这个__new__ deprecation问题:

该消息的意思就是它所说的。:-) 使用超过类参数调用 object.__new__() 是没有意义的,任何这样做的代码都只是将这些 args 转储到黑洞中。

object.__new__() 忽略额外参数唯一有意义的时候是它没有被覆盖,但 __init__覆盖 - 然后你有一个完全默认的 __new__ 并且构造函数参数的检查被降级到 __init__。

所有这些的目的是在像 object(42) 这样的调用中捕获错误,该调用(再次)传递了一个未使用的参数。这通常是程序中存在错误的症状。

——圭多

于 2009-10-19T19:22:52.723 回答
1

警告来自__new__()可以拥有 args 的事实,但由于它们在任何地方都被忽略,因此将 args(cls 除外)传递给它会导致警告。传递额外的参数实际上(当前)不是错误,但它们没有效果。

在 py3k 中,传递 args 将成为错误。

于 2009-10-19T19:12:15.220 回答