2

一部のデータを解析する Python スクリプトを作成しています。現時点では、「プレースホルダー」オブジェクトを作成するクラスを作成しようとしています。各「プレースホルダー」変数を繰り返し渡し、最終的にそれをdict、float、list、または string に変換するつもりです。説明するには時間がかかるため、メソッドを呼び出してインスタンスを置き換えることができれば、はるかに簡単になります。

簡単な例を次に示します

class Event( dict ):

    def __init__( self ):

        self.sumA = 0.0
        self.sumB = 0.0

    def augmentA( self, i ):

        self.sumA += i

    def augmentB( self, i ):

        self.sumB += i

    def seal( self ):

        if self.sumA != 0 and self.sumB != 0:
            self = [ sumA, sumB ]

        elif self.sumA != 0:
            self = float( sumA )

        elif self.sumB != 0:
            self = float( sumB )

そして、私がやりたいことは次のとおりです。

e = Event()
e.augmentA( 1 )
e.augmentA( 2 )
e.seal()

...そして 'e' を float に変えます。

私が避けたいのは:

e = Event()
e.augmentA( 1 )
e.augmentA( 2 )
e = e.getSealedValue()

「seal」メソッドの「self」は単なるローカル変数であり、スコープ外のインスタンスには影響しないことを完全に理解しています。ただし、コードにとって最も便利なインスタンス内から、必要なものをどのように達成するかはわかりません。また、すべてのビルトイン ( getItemtoStr )をオーバーライドできることも理解していますが、それによってコードが非常に複雑になります。

私はPython初心者なので、これが可能かどうかはわかりません. 私を甘やかしてください:)

4

3 に答える 3

2

いいえ、メソッドを呼び出して変数の値を置き換えることはできません。これを行う通常の方法は、あなたが述べたことです:e = e.getSealedValue()

オブジェクトの動作を変更することはできますが、それは一般的に悪い考えであり、非常に保守しにくいコードになる可能性があります。

于 2012-08-12T04:52:20.237 に答える
2

状況によっては、Python ではオブジェクトのクラスをオンザフライで変更できます。ただし、以下の例が示すように、オブジェクトをクラスに変換できるわけではありません(読みやすくするために改行が追加されています)。

>>> class A(object):
...   pass
...
>>> class B(object):
...   pass
...
>>> a = A()
>>> type(a)
<class '__main__.A'>

>>> a.__class__ = B
>>> type(a)
<class '__main__.B'>

>>> a.__class__ = int
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __class__ assignment: only for heap types

(頭のてっぺんからの正確なルールはわかりませんが、クラスが__slots__たとえば使用する場合、変換を可能にするには互換性がなければなりません)

ただし、他の回答者が指摘したように、あるオブジェクトへのすべての参照を別のオブジェクトへの参照に変換する方法があったとしても、一般的にそうするのは非常に悪い考えです。絶対にやらないとは言いませんが、この手法には正当な用途があるかもしれません (たとえば、不必要な混乱を招かずにステート デザイン パターンを実装する簡単な方法だと思います)。

于 2012-08-12T04:53:30.027 に答える
2

それを機能させるための正気の方法があったとしても、オブジェクトの型を既存のコントラクトと完全に互換性のないものに変更するという理由だけで、この道をたどることは避けたいと思います。

さて、「しかし、私はそれを1か所でしか使用していません。他のコードパスは古いコントラクトを表示しません」と言うことができますが、残念ながら、単に値を利用可能にすることしかできないため、これはこのメカニズムの議論ではありません最終的なオブジェクトを取得したら、他のコード パスについて。

要するに、これをしないでください。

于 2012-08-12T04:54:42.257 に答える