5

Python2.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", )

これにより、次の非推奨の警告が表示されます。

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

少しグーグルした後、これはバグ#1683368に添付されていることがわかりました。私が理解できないのは、これが何を意味するのかということです。次の行について不平を言っています

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

これは問題ないようです。誰かがこれが問題である理由を素人の言葉で説明できますか?「これはリストのような他のビルトインと矛盾している」ことは理解していますが、その理由がわかりません。誰かがこれが私にそれをする正しい方法を示していると説明しますか?

ありがとう

4

2 に答える 2

6

python-singleton-object-instantiationを参照し、 AlexMartelliのシングルトンの例に注意してください。

class Singleton(object):

    __instance = None

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

__new__ deprecation質問はGuidoによって答えられました:

メッセージはそれが言うことを意味します。:-)クラスパラメータ以上でobject.__new __()を呼び出す意味はありません。そうするコードは、それらの引数をブラックホールにダンプするだけでした。

object .__ new __()が余分な引数を無視するのが理にかなっているのは、それがオーバーライドされていないが、 __ init__オーバーライドされている場合だけです。その場合、完全にデフォルトの__new__があり、コンストラクター引数のチェックは__init__に追いやられます。

このすべての目的は、(再び)使用されていない引数を渡すobject(42)のような呼び出しでエラーをキャッチすることです。これは多くの場合、プログラムのバグの症状です。

--Guido

于 2009-10-19T19:22:52.723 に答える
1

警告は、引数を持つことが__new__()できるという事実から来ていますが、それらはどこでも無視されるため、(cls 以外の) 引数を渡すと警告が発生します。実際には (現在のところ) 余分な引数を渡すことはエラーではありませんが、効果はありません。

py3k では引数を渡すとエラーになります。

于 2009-10-19T19:12:15.220 に答える