5

状態に関するPython 2のドキュメント__repr__として:

可能な限り、これ (つまり) は、同じ値を持つオブジェクトを再作成するために使用できる__repr__有効な Python 式のように見える必要があります(適切な環境が与えられた場合)。

では、クラスのビルトイン__repr__がそのガイドラインに従って動作しないのはなぜでしょうか?

>>> class A(object):
...   pass
>>> repr(A)
"<class 'A'>"

ガイドラインを満たすために、デフォルトは、つまり一般的に__repr__を返す必要があります。なぜそれは異なった働きをするのですか?実装は非常に簡単だと思います。"A"A.__name__


編集:「複製」の範囲

議論の中で何が返されるべきかが明確ではないことが回答でわかりreprます。私の見方では、repr関数はオブジェクトを再現できる文字列を返す必要があります。

  1. 任意のコンテキスト
  2. 自動的に(つまり、手動ではありません)。

Ad.1。組み込みクラスのケースを見てください (この SO questionから取得):

>>> from datetime import date
>>>
>>> repr(date.today())        # calls date.today().__repr__()
'datetime.date(2009, 1, 16)'

どうやら、仮定されたコンテキストは、あたかもインポートの基本的な形式、つまり を使用したかのimport datetimeようです。つまり、オブジェクトをゼロから表現する必要はないということです。コミュニティが同意したコンテキストで明確であれば、それで十分です。たとえば、直接モジュールの型と関数を使用します。合理的に聞こえますよね?eval(repr(date.today()))datetime__repr__

Ad.2。オブジェクトがどのように再構築されたかという印象を与えるだけでは不十分だreprと思います。デバッグの有用性が の目的ですstr

結論

したがって、私が期待してreprいるのは、結果に基づいて実行できるようevalにすることです。クラスの場合、クラスをゼロから再構築するコード全体を取得したくありません。代わりに、スコープ内で見えるクラスへの明確な参照が必要です。で"Module.Class"十分でしょう。Python さん、悪気はありませんが、それ"<class 'Module.Class'>"だけではありません。

4

4 に答える 4

2

もう少し複雑なクラスを考えてみましょう:

class B(object):
    def __init__(self):
        self.foo=3

repr次のようなものを返す必要があります

type("B", (object,), { "__init__": lambda self: setattr(self, "foo", 3) })

すでに 1 つの問題に注意してください。ステートメントで定義されたすべての関数を単一の式defに変換できるわけではありません。少しlambda変更:B

class B(object):
    def __init__(self, x=2, y, **kwargs):
        print "in B.__init__"

を定義するをどのように記述しますB.__init__か? 使えません

lambda self: print "in B.__init__"

lambda式にステートメントを含めることはできないためです。この単純なクラスの場合、クラスを完全に定義する単一の式を記述することはすでに不可能です。

于 2013-03-12T13:31:51.693 に答える
1

デフォルトでは、クラスの作成に使用されたステートメントを認識__repr__ できないためです。

引用するドキュメントは、 If at all possible で始まります。カスタム クラスを再作成できるように表現することはできないため、別の形式が使用されます。これは、簡単に再作成できないすべてのもののデフォルトに従います。

repr(A)を返すだけ'A'では意味がありません。を再作成するのではなくA、それを参照するだけです。"type('A', (object,), {})"クラスコンストラクターを反映することに近づくでしょうが、それはa) pythonクラスがのインスタンスであるという事実に精通していない人々を混乱させtype、b)メソッドと属性を正確に反映することは決してできません.

repr(type)出力をorの出力と比較するとrepr(int)、これらは同じパターンに従います。

于 2013-03-12T13:12:57.187 に答える
0

"<class 'A'>"定義が利用できない場合、クラスを再作成するために使用することも使用することもできないので"A"、質問は議論の余地があると思います。

于 2013-03-12T13:12:14.630 に答える