2013-03-14 13 views
9

を変える:そのアイデンティティと同様にはそれが言うこの<a href="http://docs.python.org/3.3/reference/datamodel.html">python doc page</a>でPythonのオブジェクトの「タイプ」

、オブジェクトの型も不変です。

そして私は、このスクリプトを試し、

#!python3 

class Foo: 
    num = 1 
    pass 

class Bar: 
    num = 2 
    pass 

f1,f2= Foo(), Foo() 

f2.__class__ = Bar 
print(type(f1), type(f2), f1.num, f2.num) 

結果は示しています

<class '__main__.Foo'> <class '__main__.Bar'> 1 2

私はf2typeを変えたと思います。間違って何
、私は何をしないのですか?

+0

Pythonはあなたが何をしているのか知っている意味で「大人」と言われています。問題は、「なぜオブジェクトタイプを変更したいのですか? – pepr

+1

ただ、好奇心のうち – adamsmith

+0

@peprこれは公正な理由があります。それを解剖することで、内部をよりよく理解することができます。 :) – pepr

答えて

10

ページは言う脚注1:

[1]それは 特定の制御された条件下で、オブジェクトの種類を変更するにはいくつかのケースで可能です。それは間違って 処理される場合、それはいくつかの非常に奇妙な行動につながることができますので、それは一般的に、しかし 良いアイデアではありません。

あなたはlistにF2の__class__を変更しようとした場合:

f2.__class__ = list 

A TypeErrorを送出:

TypeError: __class__ assignment: only for heap types 
+0

ああ、それは気づかなかった。だからタイプを変更しました。ありがとう:) – adamsmith

+0

@dlutxxを:今すぐオブジェクトのメモリレイアウトを変更するには、 '__slots__'を追加してみてください。これによりヒープ型も互換性がなくなります。 – eryksun

0

を私は今日同僚で、この質問をしました。彼は親クラスを持っていて、init時の入力に基づいて自動的に子クラスの1つになるようにしました。

class ClassB(object): 

    def __init__(self): 
     self.__class__ = ClassA 

    def blah2(self,t): 
     print('I give you',t) 
     return 'You are welcome' 

class ClassA(ClassB): 

    def blah(self, t): 
     print('you gave me',t) 
     return 'Thankyou' 



a = ClassB() 
print(type(a)) 
print(a.blah('sausage')) 
print(a.blah2('cabbage')) 

結果は示しています:次のスクリプトは、概念実証として働いていた にあなたはありがとう 私ソーセージ を与えた私はあなたが歓迎されている をキャベツ与える

その両方の親の子供を示し

関数が利用できるようになりました

関連する問題

 関連する問題