Created
December 1, 2016 12:01
-
-
Save stefanocrosta/1d113a6a0c79f853c30a64afc4e8ba0a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"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