An object is polymorphic when its specific type may vary.
The types a specific value may take, is called class.

It is trivial to copy an object if its type is known:

int x;
int y = x;
Here x is not polymorphic, so y is declared of same type (int) as x.
But if the specific type of x were unknown, then y could not be declared of any specific type.

The task: let a polymorphic object contain an instance of some specific type S derived from a type T.
The type T is known.
The type S is possibly unknown until run time.
The objective is to create an exact copy of such polymorphic object (not to create a reference, nor a pointer to).
Let further the type T have a method overridden by S.
This method is to be called on the copy to demonstrate that the specific type of the copy is indeed S.

import copy
 
class T:
   def classname(self): 
      return self.__class__.__name__
 
   def __init__(self):
      self.myValue = "I'm a T."
 
   def speak(self):
      print self.classname(), 'Hello', self.myValue
 
   def clone(self):
      return copy.copy(self)
 
class S1(T):
   def speak(self):
      print self.classname(),"Meow", self.myValue
 
class S2(T):
   def speak(self):
      print self.classname(),"Woof", self.myValue
 
 
print "creating initial objects of types S1, S2, and T"
a = S1()
a.myValue = 'Green'
a.speak()
 
b = S2()
b.myValue = 'Blue'
b.speak()
 
u = T()
u.myValue = 'Purple'
u.speak()
 
print "Making copy of a as u, colors and types should match"
u = a.clone()
u.speak()
a.speak()
print "Assigning new color to u, A's color should be unchanged."
u.myValue = "Orange"
u.speak()
a.speak()
 
print "Assigning u to reference same object as b, colors and types should match"
u = b
u.speak()
b.speak()
print "Assigning new color to u. Since u,b references same object b's color changes as well"
u.myValue = "Yellow"
u.speak()
b.speak()