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.
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.
The term outsider art was coined by art critic Roger Cardinal in 1972 as an English synonym for art brut (French: [aʁ bʁyt], "raw art" or "rough art"), a label created by French artist Jean Dubuffet to describe art created outside the boundaries of official culture; Dubuffet focused particularly on art by insane-asylum inmates.[33] Outsider art has emerged as a successful art marketing category (an annual Outsider Art Fair has taken place in New York since 1992). The term is sometimes misapplied as a catch-all marketing label for art created by people outside the mainstream "art world," regardless of their circumstances or the content of their work.

Modifying classes in this fashion is also possible, though the benefits are not as immediately apparent. Almost certainly, anything which could be done with class decorators could be done using metaclasses, but using metaclasses is sufficiently obscure that there is some attraction to having an easier way to make simple modifications to classes. For Python 2.4, only function/method decorators are being added.


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.
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.
The decorator pattern can be used to extend (decorate) the functionality of a certain object statically, or in some cases at run-time, independently of other instances of the same class, provided some groundwork is done at design time. This is achieved by designing a new Decorator class that wraps the original class. This wrapping could be achieved by the following sequence of steps:

Note that greet_bob(say_hello) refers to two functions, but in different ways: greet_bob() and say_hello. The say_hello function is named without parentheses. This means that only a reference to the function is passed. The function is not executed. The greet_bob() function, on the other hand, is written with parentheses, so it will be called as usual.
The decorate() proposal was that no new syntax be implemented -- instead a magic function that used introspection to manipulate the following function. Both Jp Calderone and Philip Eby produced implementations of functions that did this. Guido was pretty firmly against this -- with no new syntax, the magicness of a function like this is extremely high:
There have been a number of objections raised to this location -- the primary one is that it's the first real Python case where a line of code has an effect on a following line. The syntax available in 2.4a3 requires one decorator per line (in a2, multiple decorators could be specified on the same line), and the final decision for 2.4 final stayed one decorator per line.
Modern artists have extended the practice of painting considerably to include, as one example, collage, which began with Cubism and is not painting in the strict sense. Some modern painters incorporate different materials such as sand, cement, straw or wood for their texture. Examples of this are the works of Jean Dubuffet and Anselm Kiefer. There is a growing community of artists who use computers to "paint" color onto a digital "canvas" using programs such as Adobe Photoshop, Corel Painter, and many others. These images can be printed onto traditional canvas if required.
×