0

特定のクラスの定義とルールをコピーせずに、クラスのすべてのインスタンスをディープコピーしたいと思います。

使用目的は、クラス「OriginalClass」がある場合、そのインスタンスは格納している変数です。プログラムが進行している間、値のみを使用する OriginalClass の以前の「スナップショット」を使用できるようにしたいと考えています (そこに新しい値を保存しないため、ルールを継承する必要はありません)。

上記の簡単な例は機能し、私がやりたいことと非常によく似ています:

import copy

class VM:
    #nothing in the class
    pass

VM1=VM()
VM1.test=dict()
VM1.test['one']="hello"

def printmytext(VMPast=copy.deepcopy(VM1)):

    g.es(VMPast.test['one'])

VM1.test="Bye"

printmytext() #Returns "hello"

しかし、アイデアは次のように置き換えることです:

VMPast=copy.deepcopy(VM1)

作業コードについては、インスタンスと辞書をコピーしますが、定義はコピーしません。

その理由は、私のプログラムでディープコピーバージョンを使用する場合です(この方法:)

VMPast=copy.deepcopy(VM1)
VM1.MyMethod(VMPast.MyButton[-1])

次のエラーがスローされます。

AttributeError: AttributeSetter instance has no __call__ method

次の値のため:

VMPast.MyButton[-1]

次のように送信されました。

'__deepcopy__'

私が意図する実際の置換値の代わりに...(ボタン)、したがって、VMPastがすでにVM内のインスタンスの作業コピーである場合、これは deepcopy を返す代わりに機能します! もう 1 つのことは、インスタンスが動的であることです。元のクラスがその時点で持つ名前や値を事前に知りません。どうもありがとうございました!

4

2 に答える 2

1

ディープ コピーでは、クラス定義はコピーされず、インスタンス属性のみがコピーされます。

代わりに、新しいインスタンスを作成します。Python インスタンスは、クラス定義への参照のみを保持します。そのインスタンスをMyMethod 呼び出すだけです。

VMPast.MyMethod()

クラスにそのようなメソッドがある場合。

ディープコピーの成功を妨げるのは、特定のクラスです。

class VariableManagerClass:
    def __getattr__(self, attr):
        return AttributeSetter(self, attr)

copy.deepcopy()関数は.__deepcopy__()インスタンスのメソッドを探し、__getattr__代わりにフックがAttributeSetterクラスを返します。

attr最初に少しテストすることでこれを防ぐことができます:

class VariableManagerClass:
    def __getattr__(self, attr):
        if attr.startswith('_'):
            raise AttributeError(attr)
        return AttributeSetter(self, attr)

これは、クラスがプライベート属性または特別なメソッド名を処理しないことを示しています。

于 2013-07-19T11:17:33.863 に答える
0

クラスの値 (属性) だけを気にする場合は、__dict__メソッドを呼び出してそれらを取得できると思います。

In [1]: class Foo():
   ...:     pass
   ...: 

In [2]: foo = Foo()

In [3]: foo.bar1 = 'derp'

In [4]: foo.bar2 = 'derp derp'

In [5]: foo.__dict__
Out[5]: {'bar1': 'derp', 'bar2': 'derp derp'}

これが質問の場合は、関連する質問があります: List attributes of an object

于 2013-07-19T11:26:35.843 に答える