Seems that there are no really elegant alternative for your style of table declaration.
Only variant below, but it seems to be less elegant than yours:
declare
a_person person;
begin
select person(p.dni, p.nom) into a_person
from partners p
where p.dni = 1;
end;
I.e. decompose object to fields and construct it back.
But if you declare table with object type field, e.g.
create table new_partners (pers person)
then access would be much simpler:
declare
a_person person;
begin
select p.pers into a_person
from new_partners p
where p.pers.dni = 1;
end;