2013-03-14 4 views
9

Auf dieser python doc page heißt es:Wechsel „Typ“ von Python Objekte

Wie seine Identität, den Typ eines Objekts ist auch unveränderlich.

Und ich versuche, dieses Skript,

#!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) 

Das Ergebnis zeigt:

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

Ich glaube, ich die type von f2 geändert.
Was ist los, was fehlt mir?

+0

Python soll für "Erwachsene" in dem Sinne sein, dass Sie wissen, was Sie tun und warum. Die Frage wäre: "Warum möchten Sie den Objekttyp ändern?" – pepr

+1

Nur aus Neugier @pepr – adamsmith

+0

Dies ist ein fairer Grund. Wenn Sie es analysieren, werden Sie die Interna besser verstehen. :) – pepr

Antwort

10

Die Fußnoten eine, die Seite sagt:

[1] Es ist möglich, in einigen Fällen eines Objekts Typ zu ändern, unter bestimmten kontrollierten Bedingungen. Es ist jedoch im Allgemeinen keine gute Idee, , da es zu einigen sehr seltsamen Verhalten führen kann, wenn es falsch behandelt wird.

Wenn Sie versuchen, die __class__ von f2 zu list zu ändern:

f2.__class__ = list 

A Typeerror angehoben:

TypeError: __class__ assignment: only for heap types 
+0

Oh, habe das nicht bemerkt. Also habe ich den Typ geändert. Danke :) – adamsmith

+0

@dlutxx: Versuchen Sie nun, '__slots__' hinzuzufügen, um das Layout des Objektspeichers zu ändern. Das kann sogar Heap-Typen inkompatibel machen. – eryksun

0

ich diese Frage heute von einem Kollegen gefragt wurde. Er hatte eine Elternklasse, die sich automatisch auf Grundlage einer Eingabe bei der Initialisierungszeit als eines ihrer Kinder präsentieren wollte. Das folgende Skript als Proof of Concept gearbeitet:

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

Das Ergebnis zeigt: Sie gab mir Wurst Thankyou Ich gebe Ihnen Kohl Sie sind willkommen

, die zeigt, dass sowohl die Eltern ein Kind Funktionen stehen nun zur Verfügung