diff options
Diffstat (limited to 'pypers/preface.tex')
-rwxr-xr-x | pypers/preface.tex | 832 |
1 files changed, 832 insertions, 0 deletions
diff --git a/pypers/preface.tex b/pypers/preface.tex new file mode 100755 index 0000000..b298225 --- /dev/null +++ b/pypers/preface.tex @@ -0,0 +1,832 @@ +\documentclass[11pt,english]{book} +\usepackage{babel} +\usepackage{shortvrb} +\usepackage[latin1]{inputenc} +\usepackage{tabularx} +\usepackage{longtable} +\setlength{\extrarowheight}{2pt} +\usepackage{amsmath} +\usepackage{graphicx} +\usepackage{color} +\usepackage{multirow} +\usepackage[colorlinks=true,linkcolor=blue,urlcolor=blue]{hyperref} +\usepackage[a4paper,margin=2cm]{geometry} +%% generator Docutils: http://docutils.sourceforge.net/ +\newlength{\admonitionwidth} +\setlength{\admonitionwidth}{0.9\textwidth} +\newlength{\docinfowidth} +\setlength{\docinfowidth}{0.9\textwidth} +\newcommand{\optionlistlabel}[1]{\bf #1 \hfill} +\newenvironment{optionlist}[1] +{\begin{list}{} + {\setlength{\labelwidth}{#1} + \setlength{\rightmargin}{1cm} + \setlength{\leftmargin}{\rightmargin} + \addtolength{\leftmargin}{\labelwidth} + \addtolength{\leftmargin}{\labelsep} + \renewcommand{\makelabel}{\optionlistlabel}} +}{\end{list}} +% begin: floats for footnotes tweaking. +\setlength{\floatsep}{0.5em} +\setlength{\textfloatsep}{\fill} +\addtolength{\textfloatsep}{3em} +\renewcommand{\textfraction}{0.5} +\renewcommand{\topfraction}{0.5} +\renewcommand{\bottomfraction}{0.5} +\setcounter{totalnumber}{50} +\setcounter{topnumber}{50} +\setcounter{bottomnumber}{50} +% end floats for footnotes +% some commands, that could be overwritten in the style file. +\newcommand{\rubric}[1]{\section*{~\hfill {\it #1} \hfill ~}} +% end of "some commands" +\input{/mnt/exp/MyDocs/pypers/style.tex} +\title{OBJECT ORIENTED PROGRAMMING IN PYTHON} +\author{} +\date{} +\hypersetup{ +pdftitle={OBJECT ORIENTED PROGRAMMING IN PYTHON}, +pdfauthor={Michele Simionato} +} +\raggedbottom +\begin{document} +\maketitle + +%___________________________________________________________________________ +\begin{center} +\begin{tabularx}{\docinfowidth}{lX} +\textbf{Version}: & + 0.5 \\ +\textbf{Author}: & + Michele Simionato \\ +\textbf{E-mail}: & + mis6@pitt.edu \\ +\textbf{Home-page}: & + http://www.phyast.pitt.edu/~micheles/ \\ +\textbf{Disclaimer}: & + I release this book to the general public. +It can be freely distributed if unchanged. +As usual, I don't give any warranty: while I have tried hard to ensure the +correctness of what follows, I disclaim any responsability in case of +errors . Use it at your own risk and peril ! \\ +\end{tabularx} +\end{center} + + + +\tableofcontents + +\bigskip +\setcounter{chapter}{-1} + +%___________________________________________________________________________ + +\hypertarget{preface}{} +\chapter{Preface} +\begin{quote} +\begin{flushleft} +\emph{There~is~only~one~way~to~learn:~trough~examples} +\end{flushleft} +\end{quote} + + +%___________________________________________________________________________ + +\hypertarget{the-philosophy-of-this-book}{} +\section{The philosophy of this book} + +This book is written with the intent to help the programmer going trough +the fascinating concepts of Object Oriented Programming (OOP), in their +Python incarnation. Notice that I say to help, not to teach. Actually, +I do not think that a book can teach OOP or any other non-trivial matter +in Computer Science or other disciplines. Only the +practice can teach: practice, then practice, and practice again. +You must learn yourself from your experiments, not from the books. +Nevertheless, books are useful. They cannot teach, but they can help. +They should give you new ideas that you was not thinking about, they should +show tricks you do not find in the manual, and in general they should be of +some guidance in the uphill road to knowledge. That is the philosophy +of this book. For this reason + +1. It is not comprehensive, not systematic; +it is intended to give ideas and basis: from +that the reader is expected to cover the missing part on his own, +browsing the documentation, other sources and other books, and finally +the definite autority, the source itself. + +2. It will not even try to teach the \emph{best} practices. I will show what you can +do with Python, not what you ``should'' do. Often I will show solutions that are +not recommended. I am not a mammy saying this is +good, this is bad, do this do that. + +3. You can only learn from your failures. If you think ``it should work, if I do +X and Y'' and it works, then you have learned nothing new. +You have merely verified +that your previous knowledge was correct, but you haven't create a new +knowledge. On the other hand, when you think ``it should work, if I do +X and Y'' and it doesn't, then you have learned that your previous knowlegde +was wrong or incomplete, and you are forced to learn something new to +overcome the difficulty. For this reason, I think it is useful to report +not only how to do something, but also to report how not to do something, +showing the pitfalls of wrong approaches. + +That's in my opinion is the goal of a good book. I don't know if have +reached this goal or not (the decision is up to the reader), but at least +I have tried to follow these guidelines. + +Moreover, this is not a book on OOP, +it is a book on OOP \emph{in Python}. + +In other words, the point of view of this book is not +to emphasize general topics of OOP that are exportable to other languages, +but exactly the opposite: I want to emphasize specific techniques that one +can only use in Python, or that are difficult to translate to other +languages. Moreover, I will not provide comparisons with other +languages (except for the section ``Why Python?'' in this introduction and +in few selected other places), +in order to keep the discussion focused. + +This choice comes from the initial motivation for this book, which was +to fulfill a gap in the (otherwise excellent) Python documentation. +The problem is that the available documentation still lacks an accessible +reference of the new Python 2.2+ object-oriented features. +Since myself I have learned Python and OOP from scratch, +I have decided to write this book in order to fill that gap and +help others. + +The emphasis in this book is not in giving +solutions to specific problems (even if most of the recipes of this book +can easily be tailored to solve real life concrete problems), it is in +teaching how does it work, why it does work in some cases and why does +not work in some other cases. Avoiding too specific problems has an +additional bonus, since it allows me to use \emph{short} examples (the majority +of the scripts presented here is under 20-30 lines) which I think are +best suited to teach a new matter [\hyperlink{id2}{1}] . Notice, however, that whereas +the majority of the scripts in this book are short, it is also true +that they are pretty \emph{dense}. The density is due to various reasons: +\newcounter{listcnt1} +\begin{list}{\arabic{listcnt1}.} +{ +\usecounter{listcnt1} +\setlength{\rightmargin}{\leftmargin} +} +\item +I am defining a lot of helper functions and classes, that are +reused and enhanced during all the book. + +\item +I am doing a strong use of inheritance, therefore a script at the +end of the book can inherits from the classes defined through all +the book; + +\item +A ten line script involving metaclasses can easily perform the equivalent +of generating hundreds of lines of code in a language without metaclasses +such as Java or C++. + +\end{list} + +To my knowledge, there are no other books covering the same topics with +the same focus (be warned, however, that I haven't read so many Python +books ;-). The two references that come closest to the present book are +the \texttt{Python Cookbook} by Alex Martelli and David Ascher, and +Alex Martelli's \texttt{Python in a Nutshell}. They are quite recent books and +therefore it covers (in much less detail) some of the 2.2 features that are +the central topics to this book. +However, the Cookbook reserves to OOP only one chapter and has a quite +different philosophy from the present book, therefore there is +practically no overlapping. Also \texttt{Python in a Nutshell} covers +metaclasses in few pages, whereas half of this book is essentially +dedied to them. This means that you can read both ;-) +\begin{figure}[b]\hypertarget{id2}[1] +Readers that prefer the opposite philosophy of using longer, +real life-like, examples, have already the excellent ``Dive into +Python'' book \href{http://diveintopython.org/}{http://diveintopython.org/} at their disposal. This is +a very good book that I certainly recommend to any (experienced) +Python programmer; it is also freely available (just like this ;-). +However, the choice of arguments is quite different and there is +essentially no overlap between my book and ``Dive into Python'' +(therefore you can read both ;-). +\end{figure} + + +%___________________________________________________________________________ + +\hypertarget{for-who-this-book-in-intended}{} +\section{For who this book in intended} + +I have tried to make this tutorial useful to a large public of Pythonistas, +i.e. both people with no previous experience of Object Oriented Programming +and people with experience on OOP, but unfamiliar with the most +recent Python 2.2-2.3 features (such as attribute descriptors, +metaclasses, change of the MRO in multiple inheritance, etc). +However, this is not a book for beginners: the non-experienced reader should +check (at least) the Internet sites www.python.org/newbies.com and +www.awaretek.com, that provide a nice collection of resources for Python +newbies. + +These are my recommendations for the reader, according to her/his level: +\newcounter{listcnt2} +\begin{list}{\arabic{listcnt2}.} +{ +\usecounter{listcnt2} +\setlength{\rightmargin}{\leftmargin} +} +\item +If you are an absolute beginner, with no experience on programming, +this book is \emph{not} for you (yet ;-). Go to +\href{http://www.python.org/doc/Newbies.html}{http://www.python.org/doc/Newbies.html} and read one of the introductive +texts listed there, then come back here. I recommend ``How to Think Like +a Computer Scientist'', available for free on the net (see +\href{http://www.ibiblio.org/obp/thinkCSpy/}{http://www.ibiblio.org/obp/thinkCSpy/}); I found it useful myself when +I started learning Python; be warned, however, that it refers to the rather +old Python version 1.5.2. There are also excellent books +on the market (see \href{http://www.awaretek.com/plf.html}{http://www.awaretek.com/plf.html}). +\href{http://www.uselesspython.com/}{http://www.uselesspython.com/} is a good resource to find recensions +about available Python books. For free books, look at +\href{http://www.tcfb.com/freetechbooks/bookphyton.html}{http://www.tcfb.com/freetechbooks/bookphyton.html} . +This is \emph{not} another Python tutorial. + +\item +If you know already (at least) another programming language, but you don't +know Python, then this book is \emph{not} for you (again ;-). Read the FAQ, the +Python Tutorial and play a little with the Standard Library (all this +material can be downloaded for free from \href{http://www.python.org}{http://www.python.org}), then +come back here. + +\item +If you have passed steps 1 and 2, and you are confortable with Python +at the level of simple procedural programming, but have no clue about +objects and classes, \emph{then} this book is for you. Read this book till +the end and your knowledge of OOP will pass from zero to a quite advanced +level (hopefully). Of course, you will have to play with the code in +this book and write a lot of code on your own, first ;-) + +\item +If you are confortable with Python and you also known OOP from other +languages or from earlier version of Python, then this book is for +you, too: you are ready to read the more advanced chapters. + +\item +If you are a Python guru, then you should read the book, too. I expect +you will find the errors and send me feedback, helping me to improve +this tutorial. + +\end{list} + + +%___________________________________________________________________________ + +\hypertarget{about-the-scripts-in-this-book}{} +\section{About the scripts in this book} + +All the scripts in this book are free. You are expected to play +with them, to modify them and to improve them. + +In order to facilitate the extraction of the scripts from the main text, both +visually for the reader and automatically for Python, I use the +convention of sandwiching the body of the example scripts in blocks like this +\begin{quote} +\begin{ttfamily}\begin{flushleft} +\mbox{{\#}{$<$}myfirstscript.py{$>$}}\\ +\mbox{}\\ +\mbox{print~"Here~Starts~the~Python~Way~to~Object~Oriented~Programming~!"}\\ +\mbox{}\\ +\mbox{{\#}{$<$}/myfirstscript.py{$>$}} +\end{flushleft}\end{ttfamily} +\end{quote} + +You may extract the source of this script with the a Python program +called ``test.py'' and provided in the distribution. Simply give the +following command: +\begin{quote} +\begin{ttfamily}\begin{flushleft} +\mbox{{\$}~python~test.py~myfirstscript.py} +\end{flushleft}\end{ttfamily} +\end{quote} + +This will create a file called ``myfirstscript.py'', containing the +source of \texttt{myfirstscript.py}; moreover it will execute the script +and write its output in a file called ``output.txt''. I have tested +all the scripts in this tutorial under Red Hat Linux 7.x and +Windows 98SE. You should not have any problem in running them, +but if a problem is there, ``test.py'' will probably discover it, +even if, unfortunately, it will not provide the solution :-(. +Notice that test.py requires Python 2.3+ to work, since most of +the examples in this book heavily depends on the new features +introduced in Python 2.2-2.3. Since the installation of Python +2.3 is simple, quick and free, I think I am requiring to my readers +who haven't upgraded yet a very little effort. This is well worth +the pain since Python 2.3 fixes few bugs of 2.2 (notably in the subject of +attribute descriptors and the \texttt{super} built-in) that makes + +You may give more arguments to test.py, as in this example: +\begin{quote} +\begin{ttfamily}\begin{flushleft} +\mbox{{\$}~python~test.py~myfirstscript.py~mysecondscript.py} +\end{flushleft}\end{ttfamily} +\end{quote} + +The output of both scripts will still be placed in the file ``output.txt''. +Notice that if you give an argument which is not the name of a script in the +book, it will be simply ignored. Morever, if you will not give any argument, +``test.py'' will automatically executes all the tutorial scripts, writing their +output in ``output.txt'' [\hyperlink{id4}{2}] . You may want to give a look at this file, once +you have finished the tutorial. It also contains the source code of +the scripts, for better readability. + +Many examples of this tutorial depend on utility functions defined +in a external module called \texttt{oopp} (\texttt{oopp} is an obvious abbreviation +for the title of the tutorial). The module \texttt{oopp} is automatically generated +by ``test.py'', which works by extracting from the tutorial +text blocks of code of the form \texttt{{\#}{$<$}oopp.py{$>$} something {\#}{$<$}/oopp.py{$>$}} +and saving them in a file called ``oopp.py''. +Let me give an example. A very recent enhancement to Python (in +Python 2.3) has been the addition of a built-in boolean type with +values True and False: +\begin{quote} +\begin{ttfamily}\begin{flushleft} +\mbox{{\$}~python}\\ +\mbox{Python~2.3a1~({\#}1,~Jan~~6~2003,~10:31:14)}\\ +\mbox{[GCC~2.96~20000731~(Red~Hat~Linux~7.2~2.96-108.7.2)]~on~linux2}\\ +\mbox{Type~"help",~"copyright",~"credits"~or~"license"~for~more~information.}\\ +\mbox{{$>$}{$>$}{$>$}~1+1==2}\\ +\mbox{True}\\ +\mbox{{$>$}{$>$}{$>$}~1+1==3}\\ +\mbox{False}\\ +\mbox{{$>$}{$>$}{$>$}~type(True)}\\ +\mbox{{$<$}type~'bool'{$>$}}\\ +\mbox{{$>$}{$>$}{$>$}~type(False)}\\ +\mbox{{$<$}type~'bool'{$>$}} +\end{flushleft}\end{ttfamily} +\end{quote} + +However, previous version of Python use the integers 1 and 0 for +True and False respectively. +\begin{quote} +\begin{ttfamily}\begin{flushleft} +\mbox{{\$}~python}\\ +\mbox{Python~2.2~({\#}1,~Apr~12~2002,~15:29:57)}\\ +\mbox{[GCC~2.96~20000731~(Red~Hat~Linux~7.2~2.96-109)]~on~linux2}\\ +\mbox{Type~"help",~"copyright",~"credits"~or~"license"~for~more~information.}\\ +\mbox{{$>$}{$>$}{$>$}~1+1==2}\\ +\mbox{1}\\ +\mbox{{$>$}{$>$}{$>$}~1+1==3~}\\ +\mbox{0} +\end{flushleft}\end{ttfamily} +\end{quote} + +Following the 2.3 convension, in this tutorial I will use the names +\texttt{True} and \texttt{False} to denotes the numbers 1 and 0 respectively. +This is automatic in Python 2.2.1+, but not in Python 2.2. Therefore, +for sake of compatibility, it is convenient to set the values \texttt{True} +and \texttt{False} in our utility module: +\begin{quote} +\begin{ttfamily}\begin{flushleft} +\mbox{{\#}{$<$}oopp.py{$>$}}\\ +\mbox{}\\ +\mbox{import~{\_}{\_}builtin{\_}{\_}}\\ +\mbox{try:~}\\ +\mbox{~~~~{\_}{\_}builtin{\_}{\_}.True~~~{\#}look~if~True~is~already~defined}\\ +\mbox{except~AttributeError:~{\#}~if~not~add~True~and~False~to~the~builtins}\\ +\mbox{~~~~{\_}{\_}builtin{\_}{\_}.True~=~1}\\ +\mbox{~~~~{\_}{\_}builtin{\_}{\_}.False~=~0}\\ +\mbox{}\\ +\mbox{{\#}{$<$}/oopp.py{$>$}} +\end{flushleft}\end{ttfamily} +\end{quote} + +Here there is an example of usage: +\begin{quote} +\begin{ttfamily}\begin{flushleft} +\mbox{{\#}{$<$}mysecondscript.py{$>$}}\\ +\mbox{}\\ +\mbox{import~oopp}\\ +\mbox{print~"True~=",True,}\\ +\mbox{print~"False~=",False}\\ +\mbox{}\\ +\mbox{{\#}{$<$}/mysecondscript.py{$>$}} +\end{flushleft}\end{ttfamily} +\end{quote} + +The output is ``True = 1 False = 0'' under Python 2.2 and +``True = True False = False'' under Python 2.3+. +\begin{figure}[b]\hypertarget{id4}[2] +``test.py'', invoked without arguments, does not create '.py' files, +since I don't want to kludge the distribution with dozens of ten-line +scripts. I expect you may want to save only few scripts as standalone +programs, and cut and paste the others. +\end{figure} + + +%___________________________________________________________________________ + +\hypertarget{conventions-used-in-this-book}{} +\section{Conventions used in this book} + +Python expressions are denoted with monospaced fonts when in the text. +Sections marked with an asterisk can be skipped in a first reading. +Typically they have the purpose of clarifying some subtle point and +are not needed for the rest of the book. These sections are intended +for the advanced reader, but could confuse the beginner. +An example is the section about the difference between methods and +functions, or the difference between the inheritance constraint and +the metaclass constraint. + + +%___________________________________________________________________________ + +\hypertarget{introduction}{} +\chapter{Introduction} +\begin{quote} +\begin{flushleft} +\emph{A~language~that~doesn't~affect~the~way~you~think~about~programming,~\\ +is~not~worth~knowing.}~--~Alan~Perlis +\end{flushleft} +\end{quote} + + +%___________________________________________________________________________ + +\hypertarget{why-oop}{} +\section{Why OOP ?} + +I guess some of my readers, like me, have started programming in the mid-80's, +when traditional (i.e. non object-oriented) Basic and Pascal where popular as +first languages. At the time OOP was not as pervasive in software development +how it is now, most of the mainstream languages were non-object-oriented and +C++ was just being released. That was a time when the transition from +spaghetti-code to structured code was already well accomplished, but +the transition from structured programming to (the first phase of) +OOP was at the beginning. + +Nowaydays, we live in a similar time of transition . Today, the transition +to (the first phase of) OOP is well accomplished and essentially all +mainstream +languages support some elementary form of OOP. To be clear, when I say +mainstream langauges, I have in mind Java and C++: C is a remarkable +exception to the rule, since it is mainstream but not object-oriented. + +However, both Java an C++ (I mean standard Java and C++, not special +extension like DTS C++, that have quite powerful object oriented features) +are quite poor object-oriented languages: they provides only the most +elementary aspects of OOP, the features of the \emph{first phase} of OOP. + +Hence, today the transition to the \emph{second phase} of OOP is only at the +beginning, i.e mainstream language are not yet really OO, but they will +become OOP in the near future. + +By second phase of OOP I mean the phase in which the primary +objects of concern for the programmer are no more the objects, but the +metaobjects. In elementary OOP one works on objects, which have attributes +and methods (the evolution of old-fashioned data and functions) defined +by their classes; in the second phase of OOP one works on classes +which behavior is described by metaclasses. We no more modify objects +trough classes: nowadays we modify classes and class hierarchies +through metaclasses and multiple inheritance. + +It would be tempting to represent the history of programming in the last +quarter of century with an evolutionary table like that: + +\begin{longtable}[c]{|p{0.28\linewidth}|p{0.23\linewidth}|p{0.26\linewidth}|p{0.08\linewidth}|} +\hline +\textbf{ +{\~{ }}1975 +} & \textbf{ +{\~{ }}1985 +} & \textbf{ +{\~{ }}1995 +} & \textbf{ +{\~{ }}2005 +} \\ \hline +\endhead +%[visit_tbody] + +procedural programming + & +OOP1 + & +OOP2 + & +? + \\ \hline + +data,functions + & +objects,classes + & +classes,metaclasses + & +? + \\ \hline +%[depart_tbody] +\end{longtable} + +The problem is that table would be simply wrong, since in truth +Smalltalk had metaclasses already 25 years ago! And also Lisp +had \emph{in nuce} everything a long \emph{long} time ago. +The truth is that certains languages where too much ahead of their +time ;-) + +Therefore, today we already have all the ideas +and the conceptual tools to go beyond the first phase of OOP +(they where invented 20-30 years ago), nevertheless those ideas are +not yet universally known, nor implemented in mainstream languages. + +Fortunately, there are good languages +where you can access the bonus of the second phase of OOP (Smalltalk, CLOS, +Dylan, ...): unfortunately +most of them are academic and/or little known in the real world +(often for purely commercial reasons, since typically languages are not +chosen accordingly to their merits, helas!). Python is an exception to this +rule, in the sense that it is an eminently practical language (it started +as a scripting language to do Operating System administrative jobs), +which is relatively known and used in that application niche (even if some +people \emph{wrongly} think that should not be used for 'serious' things). + +There are various reasons why most mainstream languages are rather +poor languages, i.e. underfeatured languages (as Java) or powerful, but too +tricky to use, as C++. Some are good reasons (for instance \emph{efficiency}: if +efficiency is the first concern, then poor languages can be much +better suited to the goal: for instance Fortran for number crunching +and C for system programming), some are less good (economical +monopoly). There is nothing to do against these reasons: if you +need efficiency, or if you are forced to use a proprietary language +because it is the language used by your employer. However, if you +are free from these restrictions, there is another reason why you +could not choose to use a poweful language. The reason is that, +till now, programmers working in the industrial world mostly had simple +problems (I mean conceptually simple problems). In order to solve +simple problems one does not need a powerful language, and the effort +spent in learning it is not worth. + +However, nowadays the situations has changed. Now, with Internet and graphics +programming everywhere, and object-oriented languages so widespread, +now it is the time when actually people \emph{needs} metaprogramming, the +ability to changing classes and programs. Now everybody is programming +in the large. + +In this situation, it is justified to spend some time to learn better +way of programming. And of course, it is convenient to start from +the language with the flattest learning curve of all. + + +%___________________________________________________________________________ + +\hypertarget{why-python}{} +\section{Why Python ?} +\begin{quote} +\begin{flushleft} +\emph{In~many~ways,~it's~a~dull~language,~borrowing~solid~old~concepts~from~~\\ +many~other~languages~{\&}~styles:~~boring~syntax,~unsurprising~semantics,~\\ +few~automatic~coercions,~etc~etc.~~But~that's~one~of~the~things~I~like~\\ +about~it.}~~--Tim~Peters~on~Python,~16~Sep~93 +\end{flushleft} +\end{quote} + +If you are reading this book, I assume you already have some experience +with Python. If this is the case, you already know the obvious advantages +of Python such as readability, easy of use and short development time. +Nevertheless, you could only have used Python as a fast and simple +scripting language. If you are in this situation, then your risk to +have an incorrect opinion on the language like ``it is a nice little +language, but too simple to be useful in 'real' applications''. The +truth is that Python is designed to be \emph{simple}, and actually it +is; but by no means it is a ``shallow'' language. Actually, it goes +quite \emph{deep}, but it takes some time to appreciate this fact. + +Let me contrast Python with Lisp, for instance. From the beginning, +Lisp was intended to be a language for experts, for people with difficult +problems to solve. The first +users of Lisp were academicians, professors of CS and scientists. +On the contrary, from the beginning Python +was intended to be language for everybody (Python predecessor was ABC, +a language invented to teach CS to children). Python makes great a first +language for everybody, whereas Lisp would require especially +clever and motivated students (and we all know that there is lack +of them ;-) + +From this difference of origins, Python inherits an easy to learn syntax, +whereas Lisp syntax is horrible for the beginner (even if not as +horrible as C++ syntax ;-) +\begin{quote} +\begin{flushleft} +\emph{Macros~are~a~powerful~extension~to~weak~languages.~\\ +Powerful~languages~don't~need~macros~by~definition.}~~\\ +--~Christian~Tismer~on~c.l.p.~(referring~to~C) +\end{flushleft} +\end{quote} + +Despite the differences, Python borrows quite a lot from Lisp and it +is nearly as expressive as it (I say nearly since Python is +not as powerful as Lisp: by tradition, Lisp has always been on the top of +hierarchy of programming language with respect to power of abstraction). +It is true that Python lacks some powerful Lisp features: for instance +Python object model lacks multiple dispatching (for the time being ;-) +and the language lacks Lisp macros (but this unlikely to change in the +near future since Pythonistas see the lack of macro as a Good Thing [\hyperlink{id6}{3}]): +nevertheless, the point is that Python is much \emph{much} easier to learn. +You have (nearly) all the power, but without the complexity. + +One of the reasons, is that Python +try to be as \emph{less} innovative as +possible: it takes the proven good things from others, more innovative +languages, and avoids their pitfalls. If you are an experienced +programmer , it will be even easier to you to learn Python, since +there is more or less nothing which is really original to Python. +For instance: +\newcounter{listcnt3} +\begin{list}{\arabic{listcnt3}.} +{ +\usecounter{listcnt3} +\setlength{\rightmargin}{\leftmargin} +} +\item +the object model is took from languages that are good at it, such +as Smalltalk; + +\item +multiple inheritance has been modeled from languages good in it. such +as CLOS and Dylan; + +\item +regular expression follows the road opened by Perl; + +\item +functional features are borrowed from functional languages; + +\item +the idea of documentation strings come from Lisp; + +\item +list comprehension come from Haskell; + +\item +iterators and generators come from Icon; + +\item +etc. etc. (many other points here) + +\end{list} + +I thinks the really distinctive feature of Python with respect to +any other serious language I know, is that Python is \emph{easy}. You have the +power (I mean power in conceptual sense, not computational power: in +the sense of computational power the best languages are +non-object-oriented ones) +of the most powerful languages with a very little investement. +In addition to that, Python has a relatively large user base +(as compared to Smalltalk or Ruby, or the various fragmented Lisp +communities). Of course, +there is quite a difference between the user base of Python with +respect to the user base of, let say, VisualBasic or Perl. But +I would never take in consideration VisualBasic for anything serious, +whereas Perl is too ugly for my taste ;-). +Finally, Python is \emph{practical}. With this I mean the fact that +Python has libraries that +allow the user to do nearly everything, since you can access all the C/C++ +libraries with little or no effort, and all the Java libraries, though the +Python implementation known as Jython. In particular, one has the choice +between many excellent GUI's trough PyQt, wxPython, Tkinter, etc. + +Python started as an Object Oriented Programming +Languages from the beginning, nevertheless is was never intended to be +a \emph{pure} OOPL as SmallTalk or, more recently, Ruby. Python is a +\emph{multiparadigm} +language such a Lisp, that you choose your programming style according +to your problem: spaghetti-code, structured programming, functional +programming, object-oriented programming are all supported. You can +even write bad code in Python, even if it is less simple than in other +languages ;-). Python is a language which has quite evolved in its twelve +years of life (the first public release was released in February 1991) +and many new features have been integrated in the language with time. +In particular, Python 2.2 (released in 2002) was a major breakthrough +in the history of the language +for what concerns support to Object Oriented Programming (OOP). +Before the 2.2 revolution, Python Object +Orientation was good; now it is \emph{excellent}. All the fundamental features +of OOP, including pretty sophisticated ones, as metaclasses and multiple +inheritance, have now a very good support (the only missing thing is +multiple dispatching). +\begin{figure}[b]\hypertarget{id6}[3] +Python lacks macros for an intentional design choice: many people +in the community (including Guido itself) feel that macros are +``too powerful''. If you give the user the freedom to create her +own language, you must face at least three problems: i) the risk +to split the original language in dozens of different dialects; +ii) in collaborative projects, the individual programmer must +spend an huge amount of time and effort would be spent in learning +macro systems written by others; iii) not all users are good +language designers: the programmer will have to fight with badly +designed macro systems. Due to these problems, it seems unlikely +that macros will be added to Python in the future. +\end{figure} +\begin{figure}[b]\hypertarget{id7}[4] +For a good comparison between Python and Lisp I remind the reader to +the excellent Peter Norvig's article in +\href{http://www.norvig.com/python-lisp.html}{http://www.norvig.com/python-lisp.html} +\end{figure} + + +%___________________________________________________________________________ + +\hypertarget{further-thoughts}{} +\section{Further thoughts} + +Actually, the principal reasons why I begun studying +Python was the documentation and the newsgroup: Python has an outstanding +freely available documentation and an incredibly helpful newsgroup that +make extremely easy to learn the language. If I had found a comparable +free documentation/newsgroup for C++ or Lisp, I would have studied that +languages instead. + +Unfortunately, the enormous development at the software level, had no +correspondence with with an appropriate development of documentation. +As a consequence, the many beatiful, powerful and extremely \emph{useful} +new features of Python 2.2+ object orientation are mostly remained +confined to developers and power users: the average Python programmer +has remained a little a part from the rapid development and she +\emph{wrongly} thinks she has no use for the new features. There have +also been \emph{protestations} of the users against developers of the +kind ``please, stop adding thousands of complicated new extensions +to the language for which we have no use'' ! + +Extending a language is always a delicate thing to do, for a whole +bunch of reasons: +\newcounter{listcnt4} +\begin{list}{\arabic{listcnt4}.} +{ +\usecounter{listcnt4} +\setlength{\rightmargin}{\leftmargin} +} +\item +once one extension is done, it is there \emph{forever}. + +\end{list} + +My experience has been the following. + +When I first read about metaclasses, in Guido's essay +``Unifying types and classes in Python 2.2'', I thought ``Wow, +classes of classes, cool concept, but how useful is it? +Are metaclasses really providing some new functionality? +What can I do with metaclasses that I cannot do without?'' + +Clearly, in these terms, the question is rather retorical, since in principle +any Turing-complete programming languages contains all the features provided +by metaclasses. Python metaclasses themselves are implemented in C, that has +no metaclasses. Therefore, my real question was not ``What can I do +with metaclasses that I cannot do without?'' but ``How big is the convenience +provided by metaclasses, with respect to my typical applications?''. + +The answer depends on the kind of problem you are considering. For certain +classes of problems it can be \emph{very} large, as I will show in this and in +the next chapters. + +I think the biggest advantage of metaclasses is \emph{elegance}. Altough it +is true that most of what you can do with metaclasses, can be done without +metaclasses, not using metaclasses can result in a much \emph{uglier} solution. + +One needs difficult problems in order to appreciate the advantage +of powerful methods. + +If all you need is to write few scripts for copying two or three files, +there is no point in learning OOP.On the other hand, if you only +write simple programs where you define only one of two classes, there +is no point in using metaclasses. Metaclasses becomes relevant only +when you have many classes, whole classes of classes with similar +features that you want to modify. + +In this sense, metaprogramming is for experts only, i.e. with people +with difficult problems. The point however, is that nowaydays, +many persons have difficult problems. + +Finally, let me conclude this preface by recalling the +gist of Python wisdom. +\begin{quote} +\begin{verbatim}>>> import this +The Zen of Python, by Tim Peters +. +Beautiful is better than ugly. +Explicit is better than implicit. +Simple is better than complex. +Complex is better than complicated. +Flat is better than nested. +Sparse is better than dense. +Readability counts. +Special cases aren't special enough to break the rules. +Although practicality beats purity. +Errors should never pass silently. +Unless explicitly silenced. +In the face of ambiguity, refuse the temptation to guess. +There should be one-- and preferably only one --obvious way to do it. +Although that way may not be obvious at first unless you're Dutch. +Now is better than never. +Although never is often better than *right* now. +If the implementation is hard to explain, it's a bad idea. +If the implementation is easy to explain, it may be a good idea. +Namespaces are one honking great idea -- let's do more of those!\end{verbatim} +\end{quote} + +\end{document} + |