2017-07-10 10 views
0

__iter__を使用して、カスタムオブジェクトの表示方法をdictとして定義できます。 tupleのコンバージョンを個別にカスタマイズする方法はありますか? (はい、私はこれが潜在的に混乱していることを認識し、そしておそらくまれほとんどない良いアイデアです。)オブジェクトのtuple()動作のオーバーライド

デフォルトの動作を:

>>>o = MyClass() 
>>>dict(o) 
{'value': 1, 'attr_1': "foo", 'attr_2': "bar"} 
>>>tuple(o) 
(('value', 1), ('attr_1', "foo"), ('attr_2', "bar")) 

望ましい行動:ここ

>>>o = MyClass() 
>>>dict(o) 
{'value': 1, 'attr_1': "foo", 'attr_2': "bar"} 
>>>tuple(o) 
(1, {'attr_1': "foo", 'attr_2': "bar"}) 

ですクラスoの最小例は、

class MyClass(object): 

    def __init__(self): 
     self.value = 1 
     self.attributes = {'attr_1': "foo", 'attr_2': "bar"} 

    def __iter__(self): 
     yield ("value", self.value) 
     for k, v in self.attributes.items(): 
      yield (k, v) 
に属しています。

関連ではなく、辞書やタプルのための異なる構造体を持っていることについて:special method for an object to override tuple expansion?

+3

私はこれを行うことはできません。 'o.to_tuple()'メソッドを定義してみませんか? –

+0

'o'の種類は何ですか? – stamaimer

+0

@MosesKoledoye確かに私がやっていることですが、 'tuple(o)'も同じように振る舞うことができるのか不思議でした。 – leo

答えて

0

それはタプルに対して独自のコンストラクタを書くことがはるかに良いでしょう(あなたのIDEの意志を除きますあなたは少し狂っていると思う)

tuple = MyTuple.from_default_tuple 

しかし、間違いなく良い考えです。 MyTuple.from_default_tuple()を代わりに使用することをお勧めします

+0

タプルのコンストラクタをカスタム化する必要はありません。カスタムクラスは反復可能であるためです。ビルトインタプルとカスタムタプルの違いは、オブジェクトを表現する方法です。 – stamaimer

+0

@pythadありがとう! 'tuple'を上書きすることは、私が行っている場所ではありませんが、参考になるでしょう。 – leo

+1

@leo私は実際にはさらに進んでいくつもりです:* 'tuple'や' dict'のいずれかに適した値のストリームを生成するために '__iter__'に依存せず、明示的な' to_tuple'と 'to_dict'クラスメソッドを提供してください。 (あなたの '__iter__'実装が正当なものであるため、*実装*ディテールとしての' to_dict'は単に 'dict(self)'のラッパーになることができます。ルーチンを任意の型に変換します)。 – chepner

-1

することはできカスタム特別な方法__str__やタプルの__repr__

class my_tuple(tuple): 
    def __repr__(self): 
     return "(%r, %r)" % (self[0][1], dict(self[1:])) 

test = MyClass() 
print my_tuple(test) 

UPFATE

あなたはあなたの目的を達成するためのカスタムクラスの__iter__を書き換えることができます。

class MyTuple(tuple): 

    @classmethod 
    def from_default_tuple(cls): # your alternative constructor 
     pass 

そして、あなたは本当にtupleを変更したい場合は、この行には何の問題もありません:

def __iter__(self): 
    yield self.value 
    yield self.attributes 

o = MyClass() 
tuple(o) 
+0

私はあなたが何を示唆しているか分かりませんか?この例の 'o'はタプルではありません。そして、 'tuple._repr__'は型変換の際に呼び出されません。 – leo

+0

' MyClass'に '__iter__'を実装しているので、' MyClass'のインスタンスからタプルを作ることができます。 'tuple(o)'を呼び出すと、インタプリタは検査のためにタプルの '__repr__'を呼び出します。私は別の答えとあなたの質問にコメントしました。必要なのは、組み込みタプルの表現を変更することです。 – stamaimer

+0

そして私はなぜカスタムクラスのインスタンスからタプルを構築したいのかわかりません。 – stamaimer

関連する問題