This code works for our purposes but it’s not exactly dynamic. If we wanted our initial simpleMsg object to sometimes act excited and sometimes quizzical, we could only do so by instantiating entirely new objects from the relevant subclass. Moreover, the ExcitedAndQuizzicalMessage is really just a combination of ExcitedMessage and QuizzicalMessage and probably shouldn’t have its own class. To fix these problems, let’s now return to the decorator pattern and see how it might help us.

You saw that, to define a decorator, you typically define a function returning a wrapper function. The wrapper function uses *args and **kwargs to pass on arguments to the decorated function. If you want your decorator to also take arguments, you need to nest the wrapper function inside another function. In this case, you usually end up with three return statements.


A still life is a work of art depicting mostly inanimate subject matter, typically commonplace objects—which may be either natural (food, flowers, plants, rocks, or shells) or man-made (drinking glasses, books, vases, jewelry, coins, pipes, and so on). With origins in the Middle Ages and Ancient Greek/Roman art, still life paintings give the artist more leeway in the arrangement of design elements within a composition than do paintings of other types of subjects such as landscape or portraiture. Still life paintings, particularly before 1700, often contained religious and allegorical symbolism relating to the objects depicted. Some modern still life breaks the two-dimensional barrier and employs three-dimensional mixed media, and uses found objects, photography, computer graphics, as well as video and sound.

Thanks to enhanced support for multi-core processors and CPUs that use AVX2 extensions and extensive code optimizations, this is the fastest version of Painter yet. A huge selection of brushes are noticeably faster — some as much as twice as fast. You can also take advantage of faster document rendering when zooming, panning and rotating — up to 50% faster.
×