Updates to the semantics of function and method attributes.

This commit is contained in:
Barry Warsaw 2001-02-27 03:32:35 +00:00
parent ab354bb9ba
commit d4614e8371
1 changed files with 18 additions and 14 deletions

View File

@ -982,6 +982,16 @@ 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.}
Functions have another special attribute \code{\var{f}.__dict__}
(a.k.a. \code{\var{f}.func_dict}) which contains the namespace used to
support function attributes. \code{__dict__} can be accessed
directly, set to a dictionary object, or \code{None}. It can also be
deleted (but the following two lines are equivalent):
\begin{verbatim}
del func.__dict__
func.__dict__ = None
\end{verbatim}
\subsubsection{Methods \label{typesmethods}}
\obindex{method}
@ -1007,14 +1017,13 @@ 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:
Like function objects, methods objects support getting
arbitrary attributes. However, since method attributes are actually
stored on the underlying function object (i.e. \code{meth.im_func}),
setting method attributes on either bound or unbound methods is
disallowed. Attempting to set a method attribute results in a
\code{TypeError} being raised. In order to set a method attribute,
you need to explicitly set it on the underlying function object:
\begin{verbatim}
class C:
@ -1022,14 +1031,9 @@ class C:
pass
c = C()
d = C()
c.method.whoami = 'my name is c'
d.method.whoami = 'my name is d'
c.method.im_func.whoami = 'my name is c'
\end{verbatim}
If bound method attribute setting was allowed, \code{c.method.whoami}
would return ``my name is d''.
See the \citetitle[../ref/ref.html]{Python Reference Manual} for more
information.