Here is my proposal for this function:  I didn't try to run it, so there could be syntax typos and the like, but hopefully it is close enough for you to get the idea.
```
def __init__(self, throughput, blue_limit=None, red_limit=None):
    """Very simple Bandpass filter object.  This object is callable, returning dimensionless
    throughput as a function of wavelength in nanometers.

    The input parameter, throughput, may be one of several possible forms:
    1. a regular python function (or an object that acts like a function)
    2. a galsim.LookupTable
    3. a file from which a LookupTable can be read in
    4. a string which can be evaluated into a function of `wave` via `eval('lambda wave : '+throughput)
            e.g. throughput = '0.8 + 0.2 * (wave-800)`

    The argument of the function will be the wavelength in nanometers, and the output should be the 
    dimensionless throughput at that wavelength.  (Note we use wave rather than lambda, since lambda
    is a python reserved word.)

    @param throughput    Function defining the throughput at each wavelength.  See above for valid options for this parameter.
    @param blue_limit    Hard cut off of bandpass on the blue side.  This is optional if the throughput is a LookupTable or a file, but is required if the throughput is a function.
    @param red_limit     Hard cut off of bandpass on the red side.  This is optional if the throughput is a LookupTable or a file, but is required if the throughput is a function.
    """
    tp = throughput  # For brevity within this function
    if isinstance(tp, str):
        import os
        if os.path.isfile(tp):
            tp = galsim.LookupTable(file=tp)
        else:
            tp = eval('lambda wave : ' + tp)
    if blue_limit is None:
        if not isinstance(tp, galsim.LookupTable):
            raise AttributeError("blue_limit is required if throughput is not a LookupTable.")
        blue_limit = tp.x_min
    if red_limit is None:
        if not isinstance(tp, galsim.LookupTable):
            raise AttributeError("red_limit is required if throughput is not a LookupTable.")
        red_limit = tp.x_max
    self.interp = tp  # I might also suggest changing this attribute to func or something rather than interp.
    self.bluelim = blue_limit
    self.redlim = red_limit
```
I think those three attributes are the only things you need.  `bluelim` and `redlim` are used by other functions, and `interp` is used in `__call__`.  

It will require a bit of editing of truncate.  Probably can only allow the `relative_throughput` option if the throughput is a LookupTable, which doesn't sound like too onerous a restriction.  I suspect the explicit red and blue limits are more commonly what would be used there.