From 773d9f09becb5cbb6ceecb59a933f9848dcb6ace Mon Sep 17 00:00:00 2001 From: Barry Warsaw Date: Mon, 15 Jan 2001 20:28:50 +0000 Subject: Document function attributes for both the function type and the method type. The method documentation also includes a new brief discussion of `bound' vs. `unbound' and why setting an attr on a bound method is a TypeError. Includes Skip's suggested text. --- Doc/lib/libstdtypes.tex | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/Doc/lib/libstdtypes.tex b/Doc/lib/libstdtypes.tex index fe53599..01c4c81 100644 --- a/Doc/lib/libstdtypes.tex +++ b/Doc/lib/libstdtypes.tex @@ -906,6 +906,13 @@ the dictionary used as the function's global namespace (this is the same as \code{\var{m}.__dict__} where \var{m} is the module in which the function \var{f} was defined). +Function objects also support getting and setting arbitrary +attributes, which can be used to, e.g. attach metadata to functions. +Regular attribute dot-notation is used to get and set such +attributes. \emph{Note that the current implementation only supports +function attributes on functions written in Python. Function +attributes on built-ins may be supported in the future.} + \subsubsection{Methods \label{typesmethods}} \obindex{method} @@ -923,6 +930,37 @@ implementing the method. Calling \code{\var{m}(\var{arg-1}, calling \code{\var{m}.im_func(\var{m}.im_self, \var{arg-1}, \var{arg-2}, \textrm{\ldots}, \var{arg-n})}. +Class instance methods are either \emph{bound} or \emph{unbound}, +referring to whether the method was accessed through an instance or a +class, respectively. When a method is unbound, its \code{im_self} +attribute will be \code{None} and if called, an explicit \code{self} +object must be passed as the first argument. In this case, +\code{self} must be an instance of the unbound method's class (or a +subclass of that class), otherwise a \code{TypeError} is raised. + +Like function objects, methods objects support getting and setting +arbitrary attributes. However, the attributes are actually stored on +the underlying function object (i.e. \code{meth.im_func}). To avoid +surprising behavior, a \code{TypeError} is raised when an attempt is +made to set an attribute on a bound method. It is legal to get a +bound method's attribute (the underlying function's attribute is +returned), and it is also legal to set or get an unbound method's +attribute. For example: + +\begin{verbatim} +class C: + def method(self): + pass + +c = C() +d = C() +c.meth.whoami = 'my name is c' +d.meth.whoami = 'my name is d' +\end{verbatim} + +If bound method attribute setting was allowed, \code{c.meth.whoami} +would return ``my name is d''. + See the \citetitle[../ref/ref.html]{Python Reference Manual} for more information. -- cgit v0.12