Ink paintings are done with a liquid that contains pigments and/or dyes and is used to color a surface to produce an image, text, or design. Ink is used for drawing with a pen, brush, or quill. Ink can be a complex medium, composed of solvents, pigments, dyes, resins, lubricants, solubilizers, surfactants, particulate matter, fluorescers, and other materials. The components of inks serve many purposes; the ink’s carrier, colorants, and other additives control flow and thickness of the ink and its appearance when dry.

Water miscible oil paints (also called "water soluble" or "water-mixable") is a modern variety of oil paint engineered to be thinned and cleaned up with water, rather than having to use chemicals such as turpentine. It can be mixed and applied using the same techniques as traditional oil-based paint, but while still wet it can be effectively removed from brushes, palettes, and rags with ordinary soap and water. Its water solubility comes from the use of an oil medium in which one end of the molecule has been altered to bind loosely to water molecules, as in a solution.

In general, functions in Python may also have side effects rather than just turning an input into an output. The print() function is a basic example of this: it returns None while having the side effect of outputting something to the console. However, to understand decorators, it is enough to think about functions as something that turns given arguments into a value.


Painters work both indoors and out. Outside work is done in relatively mild weather. In some jobs, especially maintenance and redecoration of offices and buildings, the painter may be required to work evenings or weekends. Work is seasonal; however, new materials and methods tend to give more steady employment throughout the year. Physical and health hazards include the dangers of poisoning, falling from ladders and scaffolds, breathing paint fumes and dust. The work involves standing, bending, climbing and working with arms over the head much of the time.

When we instantiate a SimpleMessage and then pass it to the various decorators, we now get new behavior. Moreover, since both the concrete component and the concrete decorators all implement / descend from IMessage, they are interchangeable as far as the program is concerned, meaning that we can loop over them together. Further, rather than having to create a new ExcitedAndQuizzicalMessageDecorator class, we were able to achieve the same effect by double wrapping a SimpleMessage object (first in an ExcitedMessageDecorator and then in a QuizzicalMessageDecorator). Finally, note that despite having been passed into various decorators, our simpleMsg object remains unchanged at the end of the program.
One of the other advantages of the decorator pattern is that wrapped objects can retain the type of the original object. As a result, you can use original and wrapped objects interchangeably, which is a significant advantage when your goal is to write flexible code. In this manner, you can easily extend the behavior of a particular object without modifying the original code.
In England, little is known of the trade and its structures before the late 13th century, at which paint guilds began to form, amongst them the Painters Company and the Stainers Company. These two guilds eventually merged with the consent of the Lord Mayor of the City of London in 1502, forming the Worshipful Company of Painter-Stainers. The guild standardised the craft and acted as a protector of the trade secrets. In 1599, the guild asked Parliament for protection, which was eventually granted in a bill of 1606, which granted the trade protection from outside competition such as plasterers.[2]
Now we have our logit decorator in production, but when some parts of our application are considered critical, failure might be something that needs more immediate attention. Let’s say sometimes you want to just log to a file. Other times you want an email sent, so the problem is brought to your attention, and still keep a log for your own records. This is a case for using inheritence, but so far we’ve only seen functions being used to build decorators.
The decorator pattern, also known as the wrapper pattern, is when you wrap an object within another object, thus providing a means of enhancing or overriding certain behavior. The wrapper object will delegate any incoming method calls to the original object, unless it defines a new method to enhance or replace the original object’s behavior. By using the decorator pattern, you can dynamically create as many decorated objects as you want, each enhancing the behavior of the original object in a unique way — and all without mutating the original object. In this manner, you can effectively add, remove, or extend behaviors at runtime.
Now, assume one also desires the ability to add borders to windows. Again, the original Window class has no support. The ScrollingWindow subclass now poses a problem, because it has effectively created a new kind of window. If one wishes to add border support to many but not all windows, one must create subclasses WindowWithBorder and ScrollingWindowWithBorder etc. This problem gets worse with every new feature or window subtype to be added. For the decorator solution, we simply create a new BorderedWindowDecorator—at runtime, we can decorate existing windows with the ScrollingWindowDecorator or the BorderedWindowDecorator or both, as we see fit. Notice that if the functionality needs to be added to all Windows, you could modify the base class and that will do. On the other hand, sometimes (e.g., using external frameworks) it is not possible, legal, or convenient to modify the base class.

Decorator Abstractions: A decorator abstraction is an abstract class that implements the component interface. Critically, the decorator abstraction must also contain a pointer to some instance of the same interface. Inside the decorator abstraction, each of the component interface behaviors will be delegated to whichever concrete component the pointer indicates.
Modernism describes both a set of cultural tendencies and an array of associated cultural movements, originally arising from wide-scale and far-reaching changes to Western society in the late 19th century and early 20th century. Modernism was a revolt against the conservative values of realism.[26][27] The term encompasses the activities and output of those who felt the "traditional" forms of art, architecture, literature, religious faith, social organization and daily life were becoming outdated in the new economic, social and political conditions of an emerging fully industrialized world. A salient characteristic of modernism is self-consciousness. This often led to experiments with form, and work that draws attention to the processes and materials used (and to the further tendency of abstraction).[28]
There is some history in Java using @ initially as a marker in Javadoc comments [24] and later in Java 1.5 for annotations [10], which are similar to Python decorators. The fact that @ was previously unused as a token in Python also means it's clear there is no possibility of such code being parsed by an earlier version of Python, leading to possibly subtle semantic bugs. It also means that ambiguity of what is a decorator and what isn't is removed. That said, @ is still a fairly arbitrary choice. Some have suggested using | instead.
Here we ensure that the key student_id is part of the request. Although this validation works, it really does not belong in the function itself. Plus, perhaps there are other routes that use the exact same validation. So, let’s keep it DRY and abstract out any unnecessary logic with a decorator. The following @validate_json decorator will do the job:
Now, assume one also desires the ability to add borders to windows. Again, the original Window class has no support. The ScrollingWindow subclass now poses a problem, because it has effectively created a new kind of window. If one wishes to add border support to many but not all windows, one must create subclasses WindowWithBorder and ScrollingWindowWithBorder etc. This problem gets worse with every new feature or window subtype to be added. For the decorator solution, we simply create a new BorderedWindowDecorator—at runtime, we can decorate existing windows with the ScrollingWindowDecorator or the BorderedWindowDecorator or both, as we see fit. Notice that if the functionality needs to be added to all Windows, you could modify the base class and that will do. On the other hand, sometimes (e.g., using external frameworks) it is not possible, legal, or convenient to modify the base class.

Some commonly used decorators that are even built-ins in Python are @classmethod, @staticmethod, and @property. The @classmethod and @staticmethod decorators are used to define methods inside a class namespace that are not connected to a particular instance of that class. The @property decorator is used to customize getters and setters for class attributes. Expand the box below for an example using these decorators.


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.
Painters apply paint, stain, varnish and other finishes to buildings and other structures.  They select the right paint or finish for the surface to be covered, taking into account durability, ease of handling, method of application and customer's wishes. Painters first prepare the surfaces to be covered, so that the paint will adhere properly. This may require removing the old coat of paint by stripping, sanding, wire brushing, burning, scraping, or water and abrasive blasting.  Painters also wash walls and trim to remove dirt and grease, fill nail holes and cracks, sandpaper rough spots and brush off dust. On new surfaces, they apply a primer or sealer to prepare the surface for the finish coat. Painters also mix paints and match colors, relying on knowledge of paint composition and color harmony. They also cover walls and ceilings with decorative wall coverings made of paper, vinyl or fabric.
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.
This decorator works by storing the time just before the function starts running (at the line marked # 1) and just after the function finishes (at # 2). The time the function takes is then the difference between the two (at # 3). We use the time.perf_counter() function, which does a good job of measuring time intervals. Here are some examples of timings:

Moreover, the use of language is only an abstraction for a color equivalent. The word "red", for example, can cover a wide range of variations from the pure red of the visible spectrum of light. There is not a formalized register of different colors in the way that there is agreement on different notes in music, such as F or C♯. For a painter, color is not simply divided into basic (primary) and derived (complementary or mixed) colors (like red, blue, green, brown, etc.).
×