i see... adding those ()'s requires actually getting the attribute (which technically could have side effects in a class with a very poor design)
Not sure how robust this is, but perhaps it would be worth checking what is in type(r) first? For dynamic properties which return callables, this wouldn't append the ()'s... but it avoids most side effects.
for a in dir(o):
For a Response object this runs in under 1msec and produces identical results to simply the code in the else.