Method Chaining

Lawrence D’Oliveiro lawrencedo99 at gmail.com
Thu Jun 16 22:02:09 EDT 2016


Some kinds of objects often receive a whole lot of method calls in sequence. In these situations, it is handy if each method call ends with “return self”, so that you can chain the calls together. This is particularly common with graphics APIs, for instance.

Example from <http://default-cube.deviantart.com/art/Truchet-612095093>, concisely expressing a complex drawing sequence:

    (g
        .move_to((p1 + p2a) / 2)
        .line_to(p1 + (p2 - p1) * frac)
        .line_to((p1 + p1a) / 2)
        .stroke()
        .move_to((p2 + p2a) / 2)
        .line_to(p2 + (p1 - p2) * frac)
        .line_to((p2 + p1a) / 2)
        .stroke()
    )

Another example <http://default-cube.deviantart.com/art/Pattern-Dash-576369003>, where an object requires setup calls that cannot all be expressed in the constructor:

    pattern = \
        qah.Pattern.create_linear \
          (
            p0 = (0, 0),
            p1 = (pattern_length, 0), # base orientation is parallel to X-axis
            colour_stops =
                (
                    (0, Colour.from_hsva((0.475, 0.9, 0.8))),
                    (1, Colour.from_hsva((0.975, 0.9, 0.8))),
                )
          ).set_extend(CAIRO.EXTEND_REPEAT)

In <http://default-cube.deviantart.com/art/Shadow-Mask-533143786>, a temporary drawing context is created, used to create the image pattern, and then discarded, without even having to give it a name:

    mask = qah.ImageSurface.create \
      (
        format = CAIRO.FORMAT_RGB24,
        dimensions = dimensions * scale
      )
    (qah.Context.create(mask)
        .set_matrix(Matrix.scale(scale))
        .set_source_colour(primary[component])
        .set_operator(CAIRO.OPERATOR_SOURCE)
        .rectangle(spot)
        .fill()
    )


More information about the Python-list mailing list