2013-03-14 57 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')) 

结果表明: 你给我香肠 三江源 我给你白菜 欢迎您

这表明,无论是父母的孩子函数现在可用于一个