mirror of
https://github.com/boostorg/python.git
synced 2026-01-20 04:42:28 +00:00
154 lines
6.0 KiB
HTML
154 lines
6.0 KiB
HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
|
|
|
<!-- Copyright David Abrahams 2006. Distributed under the Boost -->
|
|
<!-- Software License, Version 1.0. (See accompanying -->
|
|
<!-- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -->
|
|
<html>
|
|
<head>
|
|
<meta name="generator" content=
|
|
"HTML Tidy for Windows (vers 1st August 2002), see www.w3.org">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
|
|
|
<title>Boost.Python - ObjectWrapper Concept</title>
|
|
</head>
|
|
|
|
<body link="#0000ff" vlink="#800080">
|
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
|
"header">
|
|
<tr>
|
|
<td valign="top" width="300">
|
|
<h3><a href="../../../../index.htm"><img height="86" width="277"
|
|
alt="C++ Boost" src="../../../../boost.png" border="0"></a></h3>
|
|
</td>
|
|
|
|
<td valign="top">
|
|
<h1 align="center"><a href="../index.html">Boost.Python</a></h1>
|
|
|
|
<h2 align="center">ObjectWrapper and TypeWrapper Concepts</h2>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<hr>
|
|
|
|
<dl class="page-index">
|
|
<dt><a href="#introduction">Introduction</a></dt>
|
|
|
|
<dt><a href="#concept-requirements">Concept Requirements</a></dt>
|
|
|
|
<dd>
|
|
<dl class="page-index">
|
|
<dt><a href="#ObjectWrapper-concept">ObjectWrapper Concept</a></dt>
|
|
|
|
<dt><a href="#TypeWrapper-concept">TypeWrapper Concept</a></dt>
|
|
</dl>
|
|
</dd>
|
|
|
|
<dt><a href="#caveat">Caveat</a></dt>
|
|
</dl>
|
|
|
|
<h2><a name="introduction"></a>Introduction</h2>
|
|
|
|
<p>This page defines two concepts used to describe classes which manage a
|
|
Python objects, and which are intended to support usage with a
|
|
Python-like syntax.</p>
|
|
|
|
<h2><a name="concept-requirements"></a>Concept Requirements</h2>
|
|
|
|
<h3><a name="ObjectWrapper-concept"></a>ObjectWrapper Concept</h3>
|
|
Models of the ObjectWrapper concept have <a href=
|
|
"object.html#object-spec">object</a> as a publicly-accessible base class,
|
|
and are used to supply special construction behavior and/or additional
|
|
convenient functionality through (often templated) member functions.
|
|
Except when the return type <code>R</code> is itself an <a href=
|
|
"#TypeWrapper-concept">TypeWrapper</a>, a member function invocation of
|
|
the form
|
|
<pre>
|
|
x.<i>some_function</i>(<i>a<small>1</small>, a<small>2</small>,...a<small>n</small></i>)
|
|
</pre>
|
|
always has semantics equivalent to:
|
|
<pre>
|
|
<a href=
|
|
"extract.html#extract-spec">extract</a><R>(x.attr("<i>some_function</i>")(<a
|
|
href=
|
|
"object.html#object-spec-ctors">object</a>(<i>a<small>1</small></i>), <a
|
|
href=
|
|
"object.html#object-spec-ctors">object</a>(<i>a<small>2</small></i>),...<a
|
|
href="object.html#object-spec-ctors">object</a>(<i>a<small>n</small></i>)))()
|
|
</pre>
|
|
When the <code>R</code> is an <a href=
|
|
"#TypeWrapper-concept">TypeWrapper</a>, the result type may be
|
|
constructed by taking direct posession of:
|
|
<pre>
|
|
x.attr("<i>some_function</i>")(<a href=
|
|
"object.html#object-spec-ctors">object</a>(<i>a<small>1</small></i>), <a
|
|
href=
|
|
"object.html#object-spec-ctors">object</a>(<i>a<small>2</small></i>),...<a
|
|
href=
|
|
"object.html#object-spec-ctors">object</a>(<i>a<small>n</small></i>)).ptr()
|
|
</pre>
|
|
[see <a href="#caveat">caveat</a> below]
|
|
|
|
<h3><a name="TypeWrapper-concept"></a>TypeWrapper Concept</h3>
|
|
TypeWrapper is a refinement of ObjectWrapper which is associated with a
|
|
particular Python type <code>X</code>. For a given TypeWrapper
|
|
<code>T</code>, a valid constructor expression
|
|
<pre>
|
|
T(<i>a<small>1</small>, a<small>2</small>,...a<small>n</small></i>)
|
|
</pre>
|
|
builds a new <code>T</code> object managing the result of invoking
|
|
<code>X</code> with arguments corresponding to
|
|
<pre>
|
|
<a href=
|
|
"object.html#object-spec-ctors">object</a>(<i>a<small>1</small></i>), <a
|
|
href=
|
|
"object.html#object-spec-ctors">object</a>(<i>a<small>2</small></i>),...<a
|
|
href=
|
|
"object.html#object-spec-ctors">object</a>(<i>a<small>n</small></i>)
|
|
</pre>
|
|
|
|
When used as arguments to wrapped C++ functions, or as the template
|
|
parameter to <code><a
|
|
href="extract.html#extract-spec">extract</a><></code>, only
|
|
instances of the associated Python type will be considered a match.
|
|
|
|
<h3><a name="caveat">Caveat</a></h3>
|
|
The upshot of the special member function invocation rules when the
|
|
return type is a TypeWrapper is that it is possible for the returned
|
|
object to manage a Python object of an inappropriate type. This is not
|
|
usually a serious problem; the worst-case result is that errors will be
|
|
detected at runtime a little later than they might otherwise be. For an
|
|
example of how this can occur, note that the <code><a href=
|
|
"dict.html#dict-spec">dict</a></code> member function <code>items</code>
|
|
returns an object of type <code><a href=
|
|
"list.html#list-spec">list</a></code>. Now suppose the user defines this
|
|
<code>dict</code> subclass in Python:
|
|
<pre>
|
|
>>> class mydict(dict):
|
|
... def items(self):
|
|
... return tuple(dict.items(self)) # return a tuple
|
|
</pre>
|
|
Since an instance of <code>mydict</code> is also an instance of
|
|
<code>dict</code>, when used as an argument to a wrapped C++ function,
|
|
<code><a href="dict.html#dict-spec">boost::python::dict</a></code> can
|
|
accept objects of Python type <code>mydict</code>. Invoking
|
|
<code>items()</code> on this object can result in an instance of <code><a
|
|
href="list.html#list-spec">boost::python::list</a></code> which actually
|
|
holds a Python tuple. Subsequent attempts to use list methods (e.g.
|
|
<code>append</code>, or any other mutating operation) on this object will
|
|
raise the same exception that would occur if you tried to do it from
|
|
Python.
|
|
<hr>
|
|
|
|
<p>Revised
|
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
|
13 November, 2002
|
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
|
</p>
|
|
|
|
<p><i>© Copyright <a href=
|
|
"../../../../people/dave_abrahams.htm">Dave Abrahams</a> 2002.</i></p>
|
|
</body>
|
|
</html>
|
|
|