Skip to content

Instantly share code, notes, and snippets.

@stefanocrosta
Created December 1, 2016 12:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save stefanocrosta/1d113a6a0c79f853c30a64afc4e8ba0a to your computer and use it in GitHub Desktop.
Save stefanocrosta/1d113a6a0c79f853c30a64afc4e8ba0a to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Initializing ChildClassA: base_arg: 1 mixin_arg: 3 base_arg2: 2\n",
"\tBaseClass: 1, 2\n",
"\tMixinClass: 3\n",
"Initializing ChildClassB: base_arg: 1 mixin_arg: 3 base_arg2: 2\n",
"\tBaseClass: 1, 2\n",
"\tMixinClass: 3\n",
"Initializing ChildClassC: base_arg: 1 mixin_arg: 3 base_arg2: 2\n",
"\tBaseClass: 1, 2\n",
"\tMixinClassB: 3\n",
"\tMixinClass: 3\n",
"Initializing ChildClassD: base_arg: 1 mixin_arg: 3 base_arg2: 2\n",
"\tBaseClass: 1, 2\n",
"\tMixinClass: 3\n"
]
},
{
"ename": "TypeError",
"evalue": "__init__() takes at least 2 arguments (1 given)",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-1-79cdb4cf21f3>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 55\u001b[0m \u001b[0mchildB\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mChildClassB\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 56\u001b[0m \u001b[0mchildC\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mChildClassC\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 57\u001b[0;31m \u001b[0mchildD\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mChildClassD\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m<ipython-input-1-79cdb4cf21f3>\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, base_arg, mixin_arg, base_arg2)\u001b[0m\n\u001b[1;32m 50\u001b[0m print \"Initializing {}: base_arg: {} mixin_arg: {} base_arg2: {}\".format(\n\u001b[1;32m 51\u001b[0m self.__class__.__name__, base_arg, mixin_arg, base_arg2)\n\u001b[0;32m---> 52\u001b[0;31m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mChildClassD\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbase_arg\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mbase_arg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmixin_arg\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmixin_arg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbase_arg2\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mbase_arg2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 53\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 54\u001b[0m \u001b[0mchildA\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mChildClassA\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# note the order of the arguments - the mixin arg is interleaved\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m<ipython-input-1-79cdb4cf21f3>\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, base_arg, base_arg2, *args, **kwargs)\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbase_arg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbase_arg2\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0;34m\"\\tBaseClass: {}, {}\"\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbase_arg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbase_arg2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mBaseClass\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbase_arg\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mbase_arg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbase_arg2\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mbase_arg2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mclass\u001b[0m \u001b[0mMixinClass\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobject\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m<ipython-input-1-79cdb4cf21f3>\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, mixin_arg, *args, **kwargs)\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmixin_arg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0;34m\"\\tMixinClass: {}\"\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmixin_arg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 9\u001b[0;31m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mMixinClass\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 10\u001b[0m \u001b[0;31m# super(MixinClass, self).__init__(*args, mixin_arg=mixin_arg, **kwargs)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mTypeError\u001b[0m: __init__() takes at least 2 arguments (1 given)"
]
}
],
"source": [
"class BaseClass(object):\n",
" def __init__(self, base_arg, base_arg2=None, *args, **kwargs):\n",
" print \"\\tBaseClass: {}, {}\".format(base_arg, base_arg2)\n",
" super(BaseClass, self).__init__(*args, base_arg=base_arg, base_arg2=base_arg2, **kwargs)\n",
" \n",
"class MixinClass(object):\n",
" def __init__(self, mixin_arg, *args, **kwargs):\n",
" print \"\\tMixinClass: {}\".format(mixin_arg)\n",
" super(MixinClass, self).__init__()\n",
"# super(MixinClass, self).__init__(*args, mixin_arg=mixin_arg, **kwargs)\n",
"\n",
"class MixinClassB(object):\n",
" def __init__(self, mixin_arg, *args, **kwargs):\n",
" print \"\\tMixinClassB: {}\".format(mixin_arg)\n",
" super(MixinClassB, self).__init__(*args, mixin_arg=mixin_arg, **kwargs)\n",
" \n",
"class ChildClassA(BaseClass, MixinClass):\n",
" \"\"\"\n",
" Let's make it work for this case\n",
" \"\"\"\n",
" def __init__(self, base_arg, mixin_arg, base_arg2=None):\n",
" print \"Initializing {}: base_arg: {} mixin_arg: {} base_arg2: {}\".format(\n",
" self.__class__.__name__, base_arg, mixin_arg, base_arg2)\n",
" super(ChildClassA, self).__init__(base_arg=base_arg, mixin_arg=mixin_arg, base_arg2=base_arg2)\n",
" \n",
"class ChildClassB(BaseClass, MixinClass):\n",
" \"\"\"\n",
" Same as above, but without specifiying the super.__init__ arguments names\n",
" \"\"\"\n",
" def __init__(self, base_arg, mixin_arg, base_arg2=None):\n",
" print \"Initializing {}: base_arg: {} mixin_arg: {} base_arg2: {}\".format(\n",
" self.__class__.__name__, base_arg, mixin_arg, base_arg2)\n",
" # If you don't specify the name of the arguments, you need to use the correct order of course:\n",
" super(ChildClassB, self).__init__(base_arg, base_arg2, mixin_arg)\n",
" \n",
"class ChildClassC(BaseClass, MixinClassB, MixinClass):\n",
" \"\"\"\n",
" Now let's simply add another mixin: before...\n",
" \"\"\"\n",
" def __init__(self, base_arg, mixin_arg, base_arg2=None):\n",
" print \"Initializing {}: base_arg: {} mixin_arg: {} base_arg2: {}\".format(\n",
" self.__class__.__name__, base_arg, mixin_arg, base_arg2)\n",
" super(ChildClassC, self).__init__(base_arg=base_arg, mixin_arg=mixin_arg, base_arg2=base_arg2)\n",
" \n",
"class ChildClassD(BaseClass, MixinClass, MixinClassB):\n",
" \"\"\"\n",
" Now let's simply add another mixin: ..and after\n",
" \"\"\"\n",
" def __init__(self, base_arg, mixin_arg, base_arg2=None):\n",
" print \"Initializing {}: base_arg: {} mixin_arg: {} base_arg2: {}\".format(\n",
" self.__class__.__name__, base_arg, mixin_arg, base_arg2)\n",
" super(ChildClassD, self).__init__(base_arg=base_arg, mixin_arg=mixin_arg, base_arg2=base_arg2) \n",
"\n",
"childA = ChildClassA(1, 3, 2) # note the order of the arguments - the mixin arg is interleaved\n",
"childB = ChildClassB(1, 3, 2)\n",
"childC = ChildClassC(1, 3, 2)\n",
"childD = ChildClassD(1, 3, 2)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\tBaseClass: 1, 2\n",
"Initializing ChildClassA: base_arg: 1 mixin_arg: 3 base_arg2: 2\n",
"\tBaseClass: 1, 2\n",
"\tMixinClass: 3\n",
"Initializing ChildClassC: base_arg: 1 mixin_arg: 3 base_arg2: 2\n",
"\tBaseClass: 1, 2\n",
"\tMixinClassB: 3\n",
"\tMixinClass: 3\n",
"Initializing ChildClassD: base_arg: 1 mixin_arg: 3 base_arg2: 2\n",
"\tBaseClass: 1, 2\n",
"\tMixinClass: 3\n",
"\tMixinClassB: 3\n"
]
}
],
"source": [
"class BaseClass(object):\n",
" def __init__(self, base_arg, base_arg2=None, *args, **kwargs):\n",
" print \"\\tBaseClass: {}, {}\".format(base_arg, base_arg2)\n",
" try:\n",
" super(BaseClass, self).__init__(*args, base_arg=base_arg, base_arg2=base_arg2, **kwargs)\n",
" except:\n",
" super(BaseClass, self).__init__()\n",
" \n",
"class MixinClass(object):\n",
" def __init__(self, mixin_arg, *args, **kwargs):\n",
" print \"\\tMixinClass: {}\".format(mixin_arg)\n",
" try:\n",
" super(MixinClass, self).__init__(*args, mixin_arg=mixin_arg, **kwargs)\n",
" except:\n",
" super(MixinClass, self).__init__()\n",
"\n",
"class MixinClassB(object):\n",
" def __init__(self, mixin_arg, *args, **kwargs):\n",
" print \"\\tMixinClassB: {}\".format(mixin_arg)\n",
" try:\n",
" super(MixinClassB, self).__init__(*args, mixin_arg=mixin_arg, **kwargs)\n",
" except:\n",
" super(MixinClassB, self).__init__()\n",
" \n",
"class ChildClassA(BaseClass, MixinClass):\n",
" \"\"\"\n",
" Let's make it work for this case\n",
" \"\"\"\n",
" def __init__(self, base_arg, mixin_arg, base_arg2=None):\n",
" print \"Initializing {}: base_arg: {} mixin_arg: {} base_arg2: {}\".format(\n",
" self.__class__.__name__, base_arg, mixin_arg, base_arg2)\n",
" super(ChildClassA, self).__init__(base_arg=base_arg, mixin_arg=mixin_arg, base_arg2=base_arg2) \n",
" \n",
"class ChildClassC(BaseClass, MixinClassB, MixinClass):\n",
" \"\"\"\n",
" Now let's simply add another mixin: before...\n",
" \"\"\"\n",
" def __init__(self, base_arg, mixin_arg, base_arg2=None):\n",
" print \"Initializing {}: base_arg: {} mixin_arg: {} base_arg2: {}\".format(\n",
" self.__class__.__name__, base_arg, mixin_arg, base_arg2)\n",
" super(ChildClassC, self).__init__(base_arg=base_arg, mixin_arg=mixin_arg, base_arg2=base_arg2)\n",
" \n",
"class ChildClassD(BaseClass, MixinClass, MixinClassB):\n",
" \"\"\"\n",
" Now let's simply add another mixin: ..and after\n",
" \"\"\"\n",
" def __init__(self, base_arg, mixin_arg, base_arg2=None):\n",
" print \"Initializing {}: base_arg: {} mixin_arg: {} base_arg2: {}\".format(\n",
" self.__class__.__name__, base_arg, mixin_arg, base_arg2)\n",
" super(ChildClassD, self).__init__(base_arg=base_arg, mixin_arg=mixin_arg, base_arg2=base_arg2) \n",
"\n",
"try:\n",
" base = BaseClass(1, 2)\n",
"except Exception as e:\n",
" print \"Failed because object.__init__ does not expect any argument ({})\".format(e)\n",
"childA = ChildClassA(1, 3, 2) # note the order of the arguments - the mixin arg is interleaved\n",
"childC = ChildClassC(1, 3, 2)\n",
"childD = ChildClassD(1, 3, 2)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.12"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment