python isinstance vs hasattr vs try / except: O que é melhor?

Estou tentando descobrir as vantagens e desvantagens entre diferentes abordagens para determinar se o objeto é ou nãoobj você pode executar açãodo_stuff(). Pelo que entendi, existem três maneiras de determinar se isso é possível:

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

Qual é o método preferido (e por que)?

questionAnswers(3)

yourAnswerToTheQuestion