@MartijnPieters answer is the way to go if possible, but if you need to try to dynamically derive the setters, you can also access the property's descriptor on the class directly, providing the instance as an argument.
foo = SomeClassIDidNotWrite()
SomeClassIDidNotWrite.a.fset(foo, val)
Or even more dynamically:
attr_name = 'a'
getattr(foo.__class__, attr_name).fset(foo, val)
Combining this with your existing get/set code and wrapping it in try/except, you can create a generic handler for all the attributes you need to work with.
for attr_name in ('A', 'B', 'C'):
try:
getter = getattr(foo, 'get' + attr_name)
setter = getattr(foo, 'set' + attr_name)
except AttributeError:
descriptor = getattr(foo.__class__, attr_name)
getter = functools.partial(descriptor.fget, foo)
setter = functools.partial(descriptor.fset, foo)
objectList.append(DataObject(getter, setter))