Monostate的Python弃用警告__new__ - 有人能解释原因吗?

rh0*_*ium 5 python deprecated monostate

我有一个基本的Monostate与Python 2.6.

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", )
Run Code Online (Sandbox Code Playgroud)

哪位高兴地给了我以下的弃权警告..

untitled:4: DeprecationWarning: object.__new__() takes no parameters
  self = object.__new__(cls, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

经过一段谷歌搜索后,我发现这是附加到Bug#1683368.我无法弄清楚这意味着什么.它抱怨以下这一行

self = object.__new__(cls, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

这似乎没问题.有人可以用非专业术语解释为什么这是一个问题.我理解"这与其他内置插件不一致,如列表",但我不确定我理解为什么.有人会解释这个让我看到正确的方法吗?

谢谢

gim*_*mel 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
Run Code Online (Sandbox Code Playgroud)

Guido回答了这个__new__ deprecation问题:

消息意味着它所说的内容.:-)调用具有多个类参数的对象.__ new __()是没有意义的,任何这样做的代码都只是将这些args转移到黑洞中.

当它是有道理的对象.__新__()忽略额外的参数唯一的一次,当它没有被覆盖,但__init__ 被覆盖-那么你有一个完全默认__new__和构造函数参数检查退居__init__.

所有这一切的目的是捕获像对象(42)这样的调用中的错误,该调用(再次)传递未使用的参数.这通常是程序中的错误的症状.

--Guido


Pau*_*lan 1

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

在 py3k 中,传递 args 会出错。