2011-09-17 10 views
0

すでに知られているように、__getattribute__()メソッドをインスタンスに対して変更しようとしています。__getattirbute__はPythonで読み取り専用の属性です(編集:appereantly、いくつかのオブジェクトに対して、そうではない)。私が気にしていることは、次のような新しいオブジェクトを作成することです:Pythonで__getattribute __()を上書きする方法

def create_new_instace(old_instance): 
    class temp(old_instance.__class__): 
     def __init__(self,*args,**kwargs): 
      "Since we will copy an already inited instance" 
      pass 
     def __getattribute__(self,attr): 
      # do stuff 
    new_instance = temp() 
    # magically copy all attrs of old_instance to new_instance 
    return new_instance 

このようなことは可能ですか?私は特に問題がない、私はちょうどこれを行う方法を知りたい。

+2

問題の詳細や、システムの目標がわかっている場合は、より詳細なヘルプを得ることができます。 –

+0

属性の読み込み可能性は '__setattribute__'メソッドに依存します – pupssman

答えて

2

__getattribute____getattr__方法here

の違いを確認してくださいあなたは__setattr__が明示的に禁止している場合を除き、インスタンスのフィールド__getattribute__に新しい値を割り当てることができます。あなたのpythonのプロンプトでこれを試してみてください:

>>>class A(object): 
>>> pass 
>>>A().__getattribute__ = myFunc 
>>>A().__getattr__ = myFunc 

__setattr__はあなたがそうすることを許可しない場合、あなたはあなたが提案したソリューションのような何かをしなければなりません。 'magically copying'属性のモジュールcopyをチェックしてください。

+0

私の目的に合わせてコピーモジュールを使用する方法を理解できませんでした。あなたはいくつかのサンプルコードを提供することはできますか? – yasar

0

あなたの目標が分かりません。

from copy import copy 
new_instance = copy(old_instance) 

こうすると、浅いコピーが作成されます。これは、別のオブジェクトの複製である新しいオブジェクトを作成するだけです。オブジェクトの深いコピーにはcopy.deepcopyもあります。

あなたが別のインスタンスのコピーを持っている派生クラスは、(あなたが何らかの理由で動的に作成する必要があると、おそらく他のカスタマイズを)属性は、使用することができますしたい場合:

from copy import copy 
def create_new_instance(old_instance): 
    class NewClass(old_instance.__class__): 
     """ 
     dynamic custom class 
     """ 
     # ... customizations 

    new_instance = copy(old_instance) 
    new_instance.__class__ = NewClass 

これはしません__class__が割り当て不可能ないくつかのシステムクラスタイプで動作します。 (例えば、list、tuple、str、私は思う)。

これらのケースでは、__new__ ...で派生クラスを定義できますが、引数を定義する "標準的な"方法があるかどうかはわかりません。

新しいクラスを動的に作成する他の理由がない限り、関数内で定義する必要はありません。

関連する問題