Inputs to a Model Hamiltonian instance can be arbitrary, so I won't worry about those now.
Outputs are well-defined; one and two -particle integrals, and overlaps, in some file format (or in memory as an array?).
I think the best way to implement this is to have functions for outputting results in the following formats:
FCIDUMP
dense arrays
sparse arrays
whatever else we can think of
(other Python APIs, like PySCF? <- my idea)
These should be free functions, which can use methods of our Model Hamiltonian objects, written according to a well-defined interface, to generate the appropriate one or two -particle integral entries when writing the file/array. The interface should also allow us to determine the symmetry of the integrals and write them according to that (if the format supports it... FCIDUMP supports it, dense arrays don't, etc).
Hamiltonian types themselves can be written with the appropriate class hierarchy: PPP -> Hubbard -> Ising, or however it goes.
The important part is, the abstraction should go:
output writer functions
<--(used by)-- HamiltonianInterface
<--(subclass)-- SpecificHamiltonianSuperclass
<--(subclass)-- SpecificHamiltonianSubclass
The Python abc library can be used to write the Hamiltonian interface.
This would then allow us enough separation to split the work between writing output types and developing specific model Hamiltonians.
Anyone else want to comment on the API?