Two permutation iterators for classes in Python with and without a generator
Well Permutation has basically equivalent code to Permutation2, but is doing things the hard way.  Therefore, I'll just look at Permutation2, particularly __iter__().


 def __iter__(self):
     curr = self.start
     stahp = False
     while not stahp:
         yield curr
         curr = self.p[curr]
         stahp = curr == self.start
     else:
         raise StopIteration



You shouldn't need to explicitly raise StopIteration.  Iteration automatically stops when the flow of control reaches the end of the function.

I find the LoLcat spelling of "stop" amusing.  However, flag variables are generally a bad idea.  You would be better off writing if curr == self.start: break, for example.  However, I'd just choose to write it like this:

def __iter__(self):
    yield self.start
    curr = self.p[curr]
    while curr != self.start:
        yield curr
        curr = self.p[curr]


(Once again, the lack of a do-while loop in Python makes life difficult.)

Take care to indent your code very carefully in Python, as whitespace is significant.  Four spaces is a very strong norm, established in PEP 8.  You've used five spaces at the first level.