{"id":2760,"date":"2021-11-07T09:34:33","date_gmt":"2021-11-07T09:34:33","guid":{"rendered":"https:\/\/www.pythontutorial.net\/?page_id=2760"},"modified":"2025-03-28T03:26:40","modified_gmt":"2025-03-28T03:26:40","slug":"python-mixin","status":"publish","type":"page","link":"https:\/\/www.pythontutorial.net\/python-oop\/python-mixin\/","title":{"rendered":"Python mixin"},"content":{"rendered":"\n<p><strong>Summary<\/strong>: in this tutorial, you&#8217;ll learn about Python mixin classes and how to use them to make the code reusable.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id='what-is-a-mixin-in-python'>What is a mixin in Python <a href=\"#what-is-a-mixin-in-python\" class=\"anchor\" id=\"what-is-a-mixin-in-python\" title=\"Anchor for What is a mixin in Python\">#<\/a><\/h2>\n\n\n\n<p>A mixin is a <a href=\"https:\/\/www.pythontutorial.net\/python-oop\/python-class\/\">class<\/a> that provides method implementations for reuse by multiple related child classes. However, the inheritance is not implying an is-a relationship.<\/p>\n\n\n\n<p>A mixin doesn&#8217;t define a new type. Therefore, it is not intended for direct instantiation.<\/p>\n\n\n\n<p>A mixin bundles a set of <a href=\"https:\/\/www.pythontutorial.net\/python-oop\/python-methods\/\">methods<\/a> for reuse. Each mixin should have a single specific behavior, implementing closely related methods.<\/p>\n\n\n\n<p>Typically, a child class uses <a href=\"https:\/\/www.pythontutorial.net\/python-oop\/python-multiple-inheritance\/\">multiple inheritance<\/a> to combine the mixin classes with a parent class.<\/p>\n\n\n\n<p>Since Python doesn&#8217;t define a formal way to define mixin classes, it&#8217;s a good practice to name mixin classes with the suffix <code>Mixin<\/code>.<\/p>\n\n\n\n<p class=\"note\">A mixin class is like an interface in <a href=\"https:\/\/www.zentut.com\/java-tutorial\/java-interface\/\" target=\"_blank\" rel=\"noreferrer noopener\">Java<\/a> and <a href=\"https:\/\/www.csharptutorial.net\/csharp-tutorial\/csharp-explicit-interface-implementation\/\">C#<\/a> with implementation. And it&#8217;s like a <a href=\"https:\/\/www.phptutorial.net\/php-oop\/php-traits\/\" target=\"_blank\" rel=\"noreferrer noopener\">trait in PHP<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id='python-mixin-example'>Python mixin example <a href=\"#python-mixin-example\" class=\"anchor\" id=\"python-mixin-example\" title=\"Anchor for Python mixin example\">#<\/a><\/h2>\n\n\n\n<p>First, define a <code>Person<\/code> class:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Person<\/span>:<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">__init__<\/span><span class=\"hljs-params\">(self, name)<\/span>:<\/span>\n        self.name = name<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Second, define an <code>Employee<\/code> class that inherits from the <code>Person<\/code> class:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Employee<\/span><span class=\"hljs-params\">(Person)<\/span>:<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">__init__<\/span><span class=\"hljs-params\">(self, name, skills, dependents)<\/span>:<\/span>\n        super().__init__(name)\n        self.skills = skills\n        self.dependents = dependents<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Third, create a new instance of the <code>Employee<\/code> class:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-keyword\">if<\/span> __name__ == <span class=\"hljs-string\">'__main__'<\/span>:\n    e = Employee(\n        name=<span class=\"hljs-string\">'John'<\/span>,\n        skills=&#91;<span class=\"hljs-string\">'Python Programming'<\/span><span class=\"hljs-string\">'Project Management'<\/span>],\n        dependents={<span class=\"hljs-string\">'wife'<\/span>: <span class=\"hljs-string\">'Jane'<\/span>, <span class=\"hljs-string\">'children'<\/span>: &#91;<span class=\"hljs-string\">'Alice'<\/span>, <span class=\"hljs-string\">'Bob'<\/span>]}\n    )<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Suppose you want to convert the <code>Employee<\/code> object to a <a href=\"https:\/\/www.pythontutorial.net\/python-basics\/python-dictionary\/\">dictionary<\/a>. To do that, you can add a new method to the <code>Employee<\/code> class, which converts the object to a dictionary.<\/p>\n\n\n\n<p>However, you may want to convert objects of other classes to <a href=\"https:\/\/www.pythontutorial.net\/python-basics\/python-dictionary\/\">dictionaries<\/a>. To make the code reusable, you can define a mixin class called <code>DictMixin<\/code> like the following:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">DictMixin<\/span>:<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">to_dict<\/span><span class=\"hljs-params\">(self)<\/span>:<\/span>\n        <span class=\"hljs-keyword\">return<\/span> self._traverse_dict(self.__dict__)\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">_traverse_dict<\/span><span class=\"hljs-params\">(self, attributes: dict)<\/span> -&gt; dict:<\/span>\n        result = {}\n        <span class=\"hljs-keyword\">for<\/span> key, value <span class=\"hljs-keyword\">in<\/span> attributes.items():\n            result&#91;key] = self._traverse(key, value)\n\n        <span class=\"hljs-keyword\">return<\/span> result\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">_traverse<\/span><span class=\"hljs-params\">(self, key, value)<\/span>:<\/span>\n        <span class=\"hljs-keyword\">if<\/span> isinstance(value, DictMixin):\n            <span class=\"hljs-keyword\">return<\/span> value.to_dict()\n        <span class=\"hljs-keyword\">elif<\/span> isinstance(value, dict):\n            <span class=\"hljs-keyword\">return<\/span> self._traverse_dict(value)\n        <span class=\"hljs-keyword\">elif<\/span> isinstance(value, list):\n            <span class=\"hljs-keyword\">return<\/span> &#91;self._traverse(key, v) <span class=\"hljs-keyword\">for<\/span> v <span class=\"hljs-keyword\">in<\/span> value]\n        <span class=\"hljs-keyword\">elif<\/span> hasattr(value, <span class=\"hljs-string\">'__dict__'<\/span>):\n            <span class=\"hljs-keyword\">return<\/span> self._traverse_dict(value.__dict__)\n        <span class=\"hljs-keyword\">else<\/span>:\n            <span class=\"hljs-keyword\">return<\/span> value<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The <code>DictMixin<\/code> class has the <code>to_dict()<\/code> method that converts an object to a dictionary.<\/p>\n\n\n\n<p>The <code>_traverse_dict()<\/code> method iterates the object&#8217;s attributes and assigns the key and value to the result.<\/p>\n\n\n\n<p>The attribute of an object may be a list, a dictionary, or an object with the <code>__dict__<\/code> attribute. Therefore, the <code>_traverse_dict()<\/code> method uses the <code>_traverse()<\/code> method to convert the attribute to value.<\/p>\n\n\n\n<p>To convert instances of the <code>Employee<\/code> class to dictionaries, the <code>Employee<\/code> needs to inherit from both <code>DictMixin<\/code> and <code>Person<\/code> classes:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Employee<\/span><span class=\"hljs-params\">(DictMixin, Person)<\/span>:<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">__init__<\/span><span class=\"hljs-params\">(self, name, skills, dependents)<\/span>:<\/span>\n        super().__init__(name)\n        self.skills = skills\n        self.dependents = dependents<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Note that you need to specify the mixin classes before other classes.<\/p>\n\n\n\n<p>The following creates a new instance of the <code>Employee<\/code> class and converts it to a dictionary:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\">e = Employee(\n    name=<span class=\"hljs-string\">'John'<\/span>,\n    skills=&#91;<span class=\"hljs-string\">'Python Programming'<\/span>, <span class=\"hljs-string\">'Project Management'<\/span>],\n    dependents={<span class=\"hljs-string\">'wife'<\/span>: <span class=\"hljs-string\">'Jane'<\/span>, <span class=\"hljs-string\">'children'<\/span>: &#91;<span class=\"hljs-string\">'Alice'<\/span>, <span class=\"hljs-string\">'Bob'<\/span>]}\n)\n\npprint(e.to_dict())<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\">{<span class=\"hljs-string\">'dependents'<\/span>: {<span class=\"hljs-string\">'children'<\/span>: &#91;<span class=\"hljs-string\">'Alice'<\/span>, <span class=\"hljs-string\">'Bob'<\/span>], <span class=\"hljs-string\">'wife'<\/span>: <span class=\"hljs-string\">'Jane'<\/span>},\n<span class=\"hljs-string\">'name'<\/span>: <span class=\"hljs-string\">'John'<\/span>,\n<span class=\"hljs-string\">'skills'<\/span>: &#91;<span class=\"hljs-string\">'Python Programming'<\/span>, <span class=\"hljs-string\">'Project Management'<\/span>]}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The following shows the complete code:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-keyword\">from<\/span> pprint <span class=\"hljs-keyword\">import<\/span> pprint\n\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">DictMixin<\/span>:<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">to_dict<\/span><span class=\"hljs-params\">(self)<\/span>:<\/span>\n        <span class=\"hljs-keyword\">return<\/span> self._traverse_dict(self.__dict__)\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">_traverse_dict<\/span><span class=\"hljs-params\">(self, attributes)<\/span>:<\/span>\n        result = {}\n        <span class=\"hljs-keyword\">for<\/span> key, value <span class=\"hljs-keyword\">in<\/span> attributes.items():\n            result&#91;key] = self._traverse(key, value)\n\n        <span class=\"hljs-keyword\">return<\/span> result\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">_traverse<\/span><span class=\"hljs-params\">(self, key, value)<\/span>:<\/span>\n        <span class=\"hljs-keyword\">if<\/span> isinstance(value, DictMixin):\n            <span class=\"hljs-keyword\">return<\/span> value.to_dict()\n        <span class=\"hljs-keyword\">elif<\/span> isinstance(value, dict):\n            <span class=\"hljs-keyword\">return<\/span> self._traverse_dict(value)\n        <span class=\"hljs-keyword\">elif<\/span> isinstance(value, list):\n            <span class=\"hljs-keyword\">return<\/span> &#91;self._traverse(key, v) <span class=\"hljs-keyword\">for<\/span> v <span class=\"hljs-keyword\">in<\/span> value]\n        <span class=\"hljs-keyword\">elif<\/span> hasattr(value, <span class=\"hljs-string\">'__dict__'<\/span>):\n            <span class=\"hljs-keyword\">return<\/span> self._traverse_dict(value.__dict__)\n        <span class=\"hljs-keyword\">else<\/span>:\n            <span class=\"hljs-keyword\">return<\/span> value\n\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Person<\/span>:<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">__init__<\/span><span class=\"hljs-params\">(self, name)<\/span>:<\/span>\n        self.name = name\n\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Employee<\/span><span class=\"hljs-params\">(DictMixin, Person)<\/span>:<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">__init__<\/span><span class=\"hljs-params\">(self, name, skills, dependents)<\/span>:<\/span>\n        super().__init__(name)\n        self.skills = skills\n        self.dependents = dependents\n\n\n<span class=\"hljs-keyword\">if<\/span> __name__ == <span class=\"hljs-string\">'__main__'<\/span>:\n    e = Employee(\n        name=<span class=\"hljs-string\">'John'<\/span>,\n        skills=&#91;<span class=\"hljs-string\">'Python Programming'<\/span>, <span class=\"hljs-string\">'Project Management'<\/span>],\n        dependents={<span class=\"hljs-string\">'wife'<\/span>: <span class=\"hljs-string\">'Jane'<\/span>, <span class=\"hljs-string\">'children'<\/span>: &#91;<span class=\"hljs-string\">'Alice'<\/span>, <span class=\"hljs-string\">'Bob'<\/span>]}\n    )\n\n    pprint(e.to_dict())<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><a href=\"https:\/\/www.pythontutorial.net\/playground\/?q=ZnJvbSBwcHJpbnQgaW1wb3J0IHBwcmludAoKCmNsYXNzIERpY3RNaXhpbjoKICAgIGRlZiB0b19kaWN0KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl90cmF2ZXJzZV9kaWN0KHNlbGYuX19kaWN0X18pCgogICAgZGVmIF90cmF2ZXJzZV9kaWN0KHNlbGYsIGF0dHJpYnV0ZXMpOgogICAgICAgIHJlc3VsdCA9IHt9CiAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gYXR0cmlidXRlcy5pdGVtcygpOgogICAgICAgICAgICByZXN1bHRba2V5XSA9IHNlbGYuX3RyYXZlcnNlKGtleSwgdmFsdWUpCgogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgX3RyYXZlcnNlKHNlbGYsIGtleSwgdmFsdWUpOgogICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIERpY3RNaXhpbik6CiAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b19kaWN0KCkKICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsIGRpY3QpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fdHJhdmVyc2VfZGljdCh2YWx1ZSkKICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsIGxpc3QpOgogICAgICAgICAgICByZXR1cm4gW3NlbGYuX3RyYXZlcnNlKGtleSwgdikgZm9yIHYgaW4gdmFsdWVdCiAgICAgICAgZWxpZiBoYXNhdHRyKHZhbHVlLCAnX19kaWN0X18nKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RyYXZlcnNlX2RpY3QodmFsdWUuX19kaWN0X18pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHZhbHVlCgoKY2xhc3MgUGVyc29uOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKCgpjbGFzcyBFbXBsb3llZShEaWN0TWl4aW4sIFBlcnNvbik6CiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgc2tpbGxzLCBkZXBlbmRlbnRzKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKG5hbWUpCiAgICAgICAgc2VsZi5za2lsbHMgPSBza2lsbHMKICAgICAgICBzZWxmLmRlcGVuZGVudHMgPSBkZXBlbmRlbnRzCgoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIGUgPSBFbXBsb3llZSgKICAgICAgICBuYW1lPSdKb2huJywKICAgICAgICBza2lsbHM9WydQeXRob24gUHJvZ3JhbW1pbmcnLCAnUHJvamVjdCBNYW5hZ2VtZW50J10sCiAgICAgICAgZGVwZW5kZW50cz17J3dpZmUnOiAnSmFuZScsICdjaGlsZHJlbic6IFsnQWxpY2UnLCAnQm9iJ119CiAgICApCgogICAgcHByaW50KGUudG9fZGljdCgpKQ%3D%3D\" target=\"_blank\" rel=\"noreferrer noopener\">Try it<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id='compose-multiple-mixin-classes'>Compose multiple mixin classes <a href=\"#compose-multiple-mixin-classes\" class=\"anchor\" id=\"compose-multiple-mixin-classes\" title=\"Anchor for Compose multiple mixin classes\">#<\/a><\/h2>\n\n\n\n<p>Suppose you want to convert the <code>Employee<\/code>&#8216;s object to JSON. To do that, you can first define a new mixin class that use the <code>json<\/code> standard module:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-keyword\">import<\/span> json\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">JSONMixin<\/span>:<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">to_json<\/span><span class=\"hljs-params\">(self)<\/span>:<\/span>\n        <span class=\"hljs-keyword\">return<\/span> json.dumps(self.to_dict())<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>And then change the <code>Employee<\/code> class so that it inherits the <code>JSONMixin<\/code> class:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Employee<\/span><span class=\"hljs-params\">(DictMixin, JSONMixin, Person)<\/span>:<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">__init__<\/span><span class=\"hljs-params\">(self, name, skills, dependents)<\/span>:<\/span>\n        super().__init__(name)\n        self.skills = skills\n        self.dependents = dependents<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The following creates a new instance of the <code>Employee<\/code> class and converts it to a dictionary and json:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-keyword\">if<\/span> __name__ == <span class=\"hljs-string\">'__main__'<\/span>:\n    e = Employee(\n        name=<span class=\"hljs-string\">'John'<\/span>,\n        skills=&#91;<span class=\"hljs-string\">'Python Programming'<\/span><span class=\"hljs-string\">'Project Management'<\/span>],\n        dependents={<span class=\"hljs-string\">'wife'<\/span>: <span class=\"hljs-string\">'Jane'<\/span>, <span class=\"hljs-string\">'children'<\/span>: &#91;<span class=\"hljs-string\">'Alice'<\/span>, <span class=\"hljs-string\">'Bob'<\/span>]}\n    )\n\n    pprint(e.to_dict())\n    print(e.to_json())<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\">{<span class=\"hljs-string\">'dependents'<\/span>: {<span class=\"hljs-string\">'children'<\/span>: &#91;<span class=\"hljs-string\">'Alice'<\/span>, <span class=\"hljs-string\">'Bob'<\/span>], <span class=\"hljs-string\">'wife'<\/span>: <span class=\"hljs-string\">'Jane'<\/span>},\n<span class=\"hljs-string\">'name'<\/span>: <span class=\"hljs-string\">'John'<\/span>,\n<span class=\"hljs-string\">'skills'<\/span>: &#91;<span class=\"hljs-string\">'Python ProgrammingProject Management'<\/span>]}\n\n{<span class=\"hljs-string\">\"name\"<\/span>: <span class=\"hljs-string\">\"John\"<\/span>, <span class=\"hljs-string\">\"skills\"<\/span>: &#91;<span class=\"hljs-string\">\"Python ProgrammingProject Management\"<\/span>], <span class=\"hljs-string\">\"dependents\"<\/span>: {<span class=\"hljs-string\">\"wife\"<\/span>: <span class=\"hljs-string\">\"Jane\"<\/span>, <span class=\"hljs-string\">\"children\"<\/span>: &#91;<span class=\"hljs-string\">\"Alice\"<\/span>, <span class=\"hljs-string\">\"Bob\"<\/span>]}}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The following shows the complete code:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-keyword\">import<\/span> json\n<span class=\"hljs-keyword\">from<\/span> pprint <span class=\"hljs-keyword\">import<\/span> pprint\n\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">DictMixin<\/span>:<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">to_dict<\/span><span class=\"hljs-params\">(self)<\/span>:<\/span>\n        <span class=\"hljs-keyword\">return<\/span> self._traverse_dict(self.__dict__)\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">_traverse_dict<\/span><span class=\"hljs-params\">(self, attributes)<\/span>:<\/span>\n        result = {}\n        <span class=\"hljs-keyword\">for<\/span> key, value <span class=\"hljs-keyword\">in<\/span> attributes.items():\n            result&#91;key] = self._traverse(key, value)\n\n        <span class=\"hljs-keyword\">return<\/span> result\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">_traverse<\/span><span class=\"hljs-params\">(self, key, value)<\/span>:<\/span>\n        <span class=\"hljs-keyword\">if<\/span> isinstance(value, DictMixin):\n            <span class=\"hljs-keyword\">return<\/span> value.to_dict()\n        <span class=\"hljs-keyword\">elif<\/span> isinstance(value, dict):\n            <span class=\"hljs-keyword\">return<\/span> self._traverse_dict(value)\n        <span class=\"hljs-keyword\">elif<\/span> isinstance(value, list):\n            <span class=\"hljs-keyword\">return<\/span> &#91;self._traverse(key, v) <span class=\"hljs-keyword\">for<\/span> v <span class=\"hljs-keyword\">in<\/span> value]\n        <span class=\"hljs-keyword\">elif<\/span> hasattr(value, <span class=\"hljs-string\">'__dict__'<\/span>):\n            <span class=\"hljs-keyword\">return<\/span> self._traverse_dict(value.__dict__)\n        <span class=\"hljs-keyword\">else<\/span>:\n            <span class=\"hljs-keyword\">return<\/span> value\n\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">JSONMixin<\/span>:<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">to_json<\/span><span class=\"hljs-params\">(self)<\/span>:<\/span>\n        <span class=\"hljs-keyword\">return<\/span> json.dumps(self.to_dict())\n\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Person<\/span>:<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">__init__<\/span><span class=\"hljs-params\">(self, name)<\/span>:<\/span>\n        self.name = name\n\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Employee<\/span><span class=\"hljs-params\">(DictMixin, JSONMixin, Person)<\/span>:<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">__init__<\/span><span class=\"hljs-params\">(self, name, skills, dependents)<\/span>:<\/span>\n        super().__init__(name)\n        self.skills = skills\n        self.dependents = dependents\n\n\n<span class=\"hljs-keyword\">if<\/span> __name__ == <span class=\"hljs-string\">'__main__'<\/span>:\n    e = Employee(\n        name=<span class=\"hljs-string\">'John'<\/span>,\n        skills=&#91;<span class=\"hljs-string\">'Python Programming'<\/span><span class=\"hljs-string\">'Project Management'<\/span>],\n        dependents={<span class=\"hljs-string\">'wife'<\/span>: <span class=\"hljs-string\">'Jane'<\/span>, <span class=\"hljs-string\">'children'<\/span>: &#91;<span class=\"hljs-string\">'Alice'<\/span>, <span class=\"hljs-string\">'Bob'<\/span>]}\n    )\n\n    pprint(e.to_dict())\n    print(e.to_json())<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><a href=\"https:\/\/www.pythontutorial.net\/playground\/?q=aW1wb3J0IGpzb24KZnJvbSBwcHJpbnQgaW1wb3J0IHBwcmludAoKCmNsYXNzIERpY3RNaXhpbjoKICAgIGRlZiB0b19kaWN0KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl90cmF2ZXJzZV9kaWN0KHNlbGYuX19kaWN0X18pCgogICAgZGVmIF90cmF2ZXJzZV9kaWN0KHNlbGYsIGF0dHJpYnV0ZXMpOgogICAgICAgIHJlc3VsdCA9IHt9CiAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gYXR0cmlidXRlcy5pdGVtcygpOgogICAgICAgICAgICByZXN1bHRba2V5XSA9IHNlbGYuX3RyYXZlcnNlKGtleSwgdmFsdWUpCgogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgX3RyYXZlcnNlKHNlbGYsIGtleSwgdmFsdWUpOgogICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIERpY3RNaXhpbik6CiAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b19kaWN0KCkKICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsIGRpY3QpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fdHJhdmVyc2VfZGljdCh2YWx1ZSkKICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsIGxpc3QpOgogICAgICAgICAgICByZXR1cm4gW3NlbGYuX3RyYXZlcnNlKGtleSwgdikgZm9yIHYgaW4gdmFsdWVdCiAgICAgICAgZWxpZiBoYXNhdHRyKHZhbHVlLCAnX19kaWN0X18nKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RyYXZlcnNlX2RpY3QodmFsdWUuX19kaWN0X18pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHZhbHVlCgoKY2xhc3MgSlNPTk1peGluOgogICAgZGVmIHRvX2pzb24oc2VsZik6CiAgICAgICAgcmV0dXJuIGpzb24uZHVtcHMoc2VsZi50b19kaWN0KCkpCgoKY2xhc3MgUGVyc29uOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKCgpjbGFzcyBFbXBsb3llZShEaWN0TWl4aW4sIEpTT05NaXhpbiwgUGVyc29uKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBza2lsbHMsIGRlcGVuZGVudHMpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18obmFtZSkKICAgICAgICBzZWxmLnNraWxscyA9IHNraWxscwogICAgICAgIHNlbGYuZGVwZW5kZW50cyA9IGRlcGVuZGVudHMKCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgZSA9IEVtcGxveWVlKAogICAgICAgIG5hbWU9J0pvaG4nLAogICAgICAgIHNraWxscz1bJ1B5dGhvbiBQcm9ncmFtbWluZycnUHJvamVjdCBNYW5hZ2VtZW50J10sCiAgICAgICAgZGVwZW5kZW50cz17J3dpZmUnOiAnSmFuZScsICdjaGlsZHJlbic6IFsnQWxpY2UnLCAnQm9iJ119CiAgICApCgogICAgcHByaW50KGUudG9fZGljdCgpKQogICAgcHJpbnQoZS50b19qc29uKCkp\" target=\"_blank\" rel=\"noreferrer noopener\">Try it<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id='summary'>Summary <a href=\"#summary\" class=\"anchor\" id=\"summary\" title=\"Anchor for Summary\">#<\/a><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A mixin class provides method implementions for resuse by multiple related subclasses.<\/li>\n<\/ul>\n<div class=\"helpful-block-content\" data-title=\"\">\n\t<header>\n\t\t<div class=\"wth-question\">Was this tutorial helpful ?<\/div>\n\t\t<div class=\"wth-thumbs\">\n\t\t\t<button\n\t\t\t\tdata-post=\"2760\"\n\t\t\t\tdata-post-url=\"https:\/\/www.pythontutorial.net\/python-oop\/python-mixin\/\"\n\t\t\t\tdata-post-title=\"Python mixin\"\n\t\t\t\tdata-response=\"1\"\n\t\t\t\tclass=\"wth-btn-rounded wth-yes-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\tclass=\"feather feather-thumbs-up block w-full h-full\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> Yes <\/span>\n\t\t\t<\/button>\n\n\t\t\t<button\n\t\t\t\tdata-response=\"0\"\n\t\t\t\tdata-post=\"2760\"\n\t\t\t\tdata-post-url=\"https:\/\/www.pythontutorial.net\/python-oop\/python-mixin\/\"\n\t\t\t\tdata-post-title=\"Python mixin\"\n\t\t\t\tclass=\"wth-btn-rounded wth-no-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> No <\/span>\n\t\t\t<\/button>\n\t\t<\/div>\n\t<\/header>\n\n\t<div class=\"wth-form hidden\">\n\t\t<div class=\"wth-form-wrapper\">\n\t\t\t<div class=\"wth-title\"><\/div>\n\t\t\t<textarea class=\"wth-message\"><\/textarea>\n\t\t\t<input type=\"button\" name=\"wth-submit\" class=\"wth-btn wth-btn-submit\" id=\"wth-submit\" \/>\n\t\t\t<input type=\"button\" class=\"wth-btn wth-btn-cancel\" value=\"Cancel\" \/>\n\t\t<\/div>\n\t<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Summary: in this tutorial, you&#8217;ll learn about Python mixin classes and how to use them to make the code reusable. What is a mixin in Python # A mixin is a class that provides method implementations for reuse by multiple related child classes. However, the inheritance is not implying an is-a relationship. A mixin doesn&#8217;t [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":417,"menu_order":37,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2760","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/pages\/2760","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/comments?post=2760"}],"version-history":[{"count":2,"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/pages\/2760\/revisions"}],"predecessor-version":[{"id":7180,"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/pages\/2760\/revisions\/7180"}],"up":[{"embeddable":true,"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/pages\/417"}],"wp:attachment":[{"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/media?parent=2760"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}