質問

さまざまな方法があるようです __repr__ 関数は戻ることができます。

私は多くのことを保存するクラスのinforabjを持っていますが、その一部はクラスのユーザーが自分で設定することを特に望んでいません。 Pythonで保護されているものは何もないことを認識していますが、とにかくそれを設定することができますが、それを定義しているようです __init__ 誰かがそれを見て、それを渡すだけで大丈夫だと思う可能性が高くなります。

(例:オブジェクトが完全に埋め込まれていると判断されたときに検証関数によって設定され、他の値から計算される値が十分な情報が保存されている場合に、他の値から計算されるブリアン... AとBが設定され、Cが計算され、オブジェクトが有効= trueとマークされます。)

それで、それをすべて考えると、__Rep__の出力を設計する最良の方法はどれですか?

    bob = InfoObj(Name="Bob")
    # Populate bob.

    # Output type A:
    bob.__repr__()
'<InfoObj object at 0x1b91ca42>'

    # Output type B:
    bob.__repr__()
'InfoObj(Name="Bob",Pants=True,A=7,B=5,C=2,Valid=True)'

    # Output type C:
    bob.__repr__()
'InfoObj.NewInfoObj(Name="Bob",Pants=True,A=7,B=5,C=2,Valid=True)'

...タイプCのポイントは、C ++で「プライベート」をコンストラクターの引数として「プライベート」に設定したすべてのものを喜んで取得しないことです。彼らのために。その場合、特定のものを取り入れていないコンストラクターと、わずかに困難な別の関数を定義します。 __repr__

違いがある場合は、これらのPythonオブジェクトをデータベースに保存することを計画しています。 __repr__ 使用して出力して取得します eval(), 、少なくとも私がより良い方法を思い付かない限り。適切なインターフェイス関数を通過する代わりに、チームメイトが手動で完全なオブジェクトを作成する結果は、誰かが彼がしたことを理解するまで、1つのタイプの情報検索が不安定になる可能性があるということです。

役に立ちましたか?

解決

__repr__ メソッドは、エンデューサーではなく開発者にとって最も有用な出力を生成するように設計されているため、この質問に本当に答えることができます。ただし、通常、オプションBを使用します。オプションAはあまり役に立たず、オプションCは不必要に冗長です - とにかくモジュールがどのようにインポートされるかはわかりません。他の人はオプションCを好むかもしれません。

ただし、Pythonオブジェクトを保存する場合はデータベースである場合は、使用してください。 pickle.

import pickle
bob = InfoObj(Name="Bob")

> pickle.dumps(bob)
b'...some bytestring representation of Bob...'

> pickle.loads(pickle.dumps(bob))
Bob(...)

古いPython(pre-3.x)を使用している場合は、 cPickle より速いですが pickle より拡張可能です。ピクルスは、構成なしでクラスの一部で動作しますが、より複雑なオブジェクトの場合、カスタムピクラーを書きたいと思うかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top