class Reclassable(object): pass def test(): class A(Reclassable): def testmethod(self): return "A" def testmethod2(self): return "A" a1 = A() assert a1.testmethod() == "A" a2 = A() assert a2.testmethod() == "A" class B(Reclassable): def testmethod(self): return "B" a1.reclass(B) assert a1.testmethod() == "B" assert a2.testmethod() == "A" class C(A): def testmethod(): return "C" c1 = C() assert c1.testmethod() == "C" assert c1.testmethod2() == "A" c2 = C() assert c2.testmethod() == "C" assert c2.testmethod2() == "A" c1.reclass(A) assert c1.testmethod() == "A" assert c1.testmethod2() == "A" class D(A): pass class E(Reclassable): def testmethod(self): return "E" def testmethod2(self): return "E" A.reclassall(E) assert a1.testmethod() == "E" assert a1.testmethod2() == "E" assert a2.testmethod() == "B" assert c1.testmethod() == "E" assert c1.testmethod2() == "E" assert c2.testmethod() == "C" assert c2.testmethod2() == "E" d = D() assert d.testmethod() == "E"