2013-03-14 91 views
9

在此python doc page它說的:改變「類型」 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
有什麼不對,我錯過了什麼?

+1

只是出於好奇@pepr – adamsmith 2016-08-11 08:46:36

+0

這是一個公平的原因。解剖它會讓你更好地理解內部。 :) – pepr 2016-08-12 12:54:22

回答

10

腳註一個頁面表示:

[1]可以在某些情況下更改對象的類型,某些 控制的條件下。一般來說,這不是一個好主意, ,因爲如果錯誤地處理了 ,它可能會導致一些非常奇怪的行爲。

如果試圖f2的__class__更改爲list

f2.__class__ = list 

一個類型錯誤提出:

TypeError: __class__ assignment: only for heap types 
+0

哦,沒有注意到。所以我改變了類型。謝謝:) – adamsmith 2013-03-14 08:43:46

+0

@dlutxx:現在嘗試添加'__slots__'來更改對象內存佈局。這可能會使堆類型不兼容。 – eryksun 2013-03-14 13:20:29

0

我被一個同事今天問這個問題。他有一個父類,想要在初始化時根據輸入自動提升自己以成爲子項目之一。下面的腳本工作作爲概念證明:

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')) 

結果表明: 你給我香腸 三江源 我給你白菜 歡迎您

這表明,無論是父母的孩子函數現在可用於一個