python isinstance vs hasattr vs try / except: Co jest lepsze?

Próbuję znaleźć kompromis między różnymi podejściami do określania, czy obiekt ma być, czy nieobj możesz wykonać akcjędo_stuff(). Jak rozumiem, istnieją trzy sposoby określenia, czy jest to możliwe:

# Way 1
if isinstance(obj, Foo):
    obj.do_stuff()

# Way 2
if hasattr(obj, 'do_stuff'):
    obj.do_stuff()

# Way 3
try:
    obj.do_stuff()
except:
    print 'Do something else'

Jaka jest preferowana metoda (i dlaczego)?

questionAnswers(3)

yourAnswerToTheQuestion