python-future/docs/notebooks/object special methods (nex...

247 lines
5.0 KiB
Plaintext

{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"``object`` special methods"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import sys\n",
"sys.version"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 1,
"text": [
"'2.7.6 (default, Mar 22 2014, 22:59:56) \\n[GCC 4.8.2]'"
]
}
],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from builtins import object"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"object??"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Py3-style iterators written as new-style classes (subclasses of\n",
"# future.builtins.object) are backward compatibile with Py2:\n",
"class Upper(object):\n",
" def __init__(self, iterable):\n",
" self._iter = iter(iterable)\n",
" def __next__(self): # note the Py3 interface\n",
" return next(self._iter).upper()\n",
" def __iter__(self):\n",
" return self"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"assert list(Upper('hello')) == list('HELLO')"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 5
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"class AllOrNothing(object):\n",
" def __init__(self, l):\n",
" self.l = l\n",
" def __bool__(self):\n",
" return all(self.l)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 6
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"container = AllOrNothing([0, 100, 200])\n",
"bool(container)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 8,
"text": [
"False"
]
}
],
"prompt_number": 8
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"container2 = AllOrNothing([-100, 100, 200])\n",
"bool(container2)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 9,
"text": [
"True"
]
}
],
"prompt_number": 9
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Classes derived from Python builtins don't have this behaviour:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"class AllOrNothingBroken(list):\n",
" def __bool__(self):\n",
" print('Called!')\n",
" return all(self)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 13
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"container3 = AllOrNothingBroken([0, 1, 2])\n",
"bool(container3)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 14,
"text": [
"True"
]
}
],
"prompt_number": 14
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"But subclasses of ``future`` types do:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from builtins import list\n",
"\n",
"class AllOrNothingFixed(list):\n",
" def __bool__(self):\n",
" print('Called!')\n",
" return all(self)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 15
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"container4 = AllOrNothingFixed([0, 1, 2])\n",
"bool(container4)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 17,
"text": [
"True"
]
}
],
"prompt_number": 17
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}