Skip to content

Commit df5cb40

Browse files
committed
Add public vs private notes and inheritance example
1 parent 6254d7b commit df5cb40

File tree

2 files changed

+347
-1
lines changed

2 files changed

+347
-1
lines changed

notebooks/beginner/classes.ipynb

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,138 @@
141141
"inst1.show_info()\n",
142142
"inst2.show_info()"
143143
]
144+
},
145+
{
146+
"cell_type": "markdown",
147+
"metadata": {},
148+
"source": [
149+
"## Public vs private\n",
150+
"In python there's now strict separation for private/public methods or instance variables. The convention is to start the name of the method or instance variable with underscore if it should be treated as private. Private means that it should not be accessed from outside of the class.\n",
151+
"\n",
152+
"For example, let's consider that we have a `Person` class which has `age` as an instance variable. We want that `age` is not directly accessed (e.g. changed) after the instance is created. In Python, this would be:"
153+
]
154+
},
155+
{
156+
"cell_type": "code",
157+
"execution_count": null,
158+
"metadata": {},
159+
"outputs": [],
160+
"source": [
161+
"class Person:\n",
162+
" def __init__(self, age):\n",
163+
" self._age = age\n",
164+
" \n",
165+
"example_person = Person(age=15)\n",
166+
"# You can't do this:\n",
167+
"# print(example_person.age)\n",
168+
"# Nor this:\n",
169+
"# example_person.age = 16"
170+
]
171+
},
172+
{
173+
"cell_type": "markdown",
174+
"metadata": {},
175+
"source": [
176+
"If you want the `age` to be readable but not writable, you can use `property`:"
177+
]
178+
},
179+
{
180+
"cell_type": "code",
181+
"execution_count": null,
182+
"metadata": {},
183+
"outputs": [],
184+
"source": [
185+
"class Person:\n",
186+
" def __init__(self, age):\n",
187+
" self._age = age\n",
188+
" \n",
189+
" @property\n",
190+
" def age(self):\n",
191+
" return self._age\n",
192+
" \n",
193+
"example_person = Person(age=15)\n",
194+
"# Now you can do this:\n",
195+
"print(example_person.age)\n",
196+
"# But not this:\n",
197+
"#example_person.age = 16"
198+
]
199+
},
200+
{
201+
"cell_type": "markdown",
202+
"metadata": {},
203+
"source": [
204+
"This way you can have a controlled access to the instance variables of your class: "
205+
]
206+
},
207+
{
208+
"cell_type": "code",
209+
"execution_count": null,
210+
"metadata": {},
211+
"outputs": [],
212+
"source": [
213+
"class Person:\n",
214+
" def __init__(self, age):\n",
215+
" self._age = age\n",
216+
" \n",
217+
" @property\n",
218+
" def age(self):\n",
219+
" return self._age\n",
220+
" \n",
221+
" def celebrate_birthday(self):\n",
222+
" self._age += 1\n",
223+
" print('Happy bday for {} years old!'.format(self._age))\n",
224+
" \n",
225+
"example_person = Person(age=15)\n",
226+
"example_person.celebrate_birthday()"
227+
]
228+
},
229+
{
230+
"cell_type": "markdown",
231+
"metadata": {},
232+
"source": [
233+
"## Introduction to inheritance"
234+
]
235+
},
236+
{
237+
"cell_type": "code",
238+
"execution_count": null,
239+
"metadata": {},
240+
"outputs": [],
241+
"source": [
242+
"class Animal:\n",
243+
" def greet(self):\n",
244+
" print('Hello, I am an animal')\n",
245+
"\n",
246+
" @property\n",
247+
" def favorite_food(self):\n",
248+
" return 'beef'\n",
249+
"\n",
250+
"\n",
251+
"class Dog(Animal):\n",
252+
" def greet(self):\n",
253+
" print('wof wof')\n",
254+
"\n",
255+
"\n",
256+
"class Cat(Animal):\n",
257+
" @property\n",
258+
" def favorite_food(self):\n",
259+
" return 'fish'"
260+
]
261+
},
262+
{
263+
"cell_type": "code",
264+
"execution_count": null,
265+
"metadata": {},
266+
"outputs": [],
267+
"source": [
268+
"dog = Dog()\n",
269+
"dog.greet()\n",
270+
"print(\"Dog's favorite food is {}\".format(dog.favorite_food))\n",
271+
"\n",
272+
"cat = Cat()\n",
273+
"cat.greet()\n",
274+
"print(\"Cat's favorite food is {}\".format(cat.favorite_food))"
275+
]
144276
}
145277
],
146278
"metadata": {

notebooks/beginner/html/classes.html

Lines changed: 215 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11846,7 +11846,7 @@ <h1 id="Classes"><a href="https://docs.python.org/3/tutorial/classes.html#a-firs
1184611846

1184711847

1184811848
<div class="output_subarea output_stream output_stdout output_text">
11849-
<pre>my_intance: &lt;__main__.MyFirstClass object at 0x1050163c8&gt;
11849+
<pre>my_intance: &lt;__main__.MyFirstClass object at 0x1060c5978&gt;
1185011850
type: &lt;class &#39;__main__.MyFirstClass&#39;&gt;
1185111851
my_instance.name: John Doe
1185211852
</pre>
@@ -12061,6 +12061,220 @@ <h2 id="Class-variables-vs-instance-variables">Class variables vs instance varia
1206112061
</div>
1206212062
</div>
1206312063

12064+
</div>
12065+
<div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
12066+
</div>
12067+
<div class="inner_cell">
12068+
<div class="text_cell_render border-box-sizing rendered_html">
12069+
<h2 id="Public-vs-private">Public vs private<a class="anchor-link" href="#Public-vs-private">&#182;</a></h2><p>In python there's now strict separation for private/public methods or instance variables. The convention is to start the name of the method or instance variable with underscore if it should be treated as private. Private means that it should not be accessed from outside of the class.</p>
12070+
<p>For example, let's consider that we have a <code>Person</code> class which has <code>age</code> as an instance variable. We want that <code>age</code> is not directly accessed (e.g. changed) after the instance is created. In Python, this would be:</p>
12071+
12072+
</div>
12073+
</div>
12074+
</div>
12075+
<div class="cell border-box-sizing code_cell rendered">
12076+
<div class="input">
12077+
<div class="prompt input_prompt">In&nbsp;[7]:</div>
12078+
<div class="inner_cell">
12079+
<div class="input_area">
12080+
<div class=" highlight hl-ipython3"><pre><span></span><span class="k">class</span> <span class="nc">Person</span><span class="p">:</span>
12081+
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">age</span><span class="p">):</span>
12082+
<span class="bp">self</span><span class="o">.</span><span class="n">_age</span> <span class="o">=</span> <span class="n">age</span>
12083+
12084+
<span class="n">example_person</span> <span class="o">=</span> <span class="n">Person</span><span class="p">(</span><span class="n">age</span><span class="o">=</span><span class="mi">15</span><span class="p">)</span>
12085+
<span class="c1"># You can&#39;t do this:</span>
12086+
<span class="c1"># print(example_person.age)</span>
12087+
<span class="c1"># Nor this:</span>
12088+
<span class="c1"># example_person.age = 16</span>
12089+
</pre></div>
12090+
12091+
</div>
12092+
</div>
12093+
</div>
12094+
12095+
</div>
12096+
<div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
12097+
</div>
12098+
<div class="inner_cell">
12099+
<div class="text_cell_render border-box-sizing rendered_html">
12100+
<p>If you want the <code>age</code> to be readable but not writable, you can use <code>property</code>:</p>
12101+
12102+
</div>
12103+
</div>
12104+
</div>
12105+
<div class="cell border-box-sizing code_cell rendered">
12106+
<div class="input">
12107+
<div class="prompt input_prompt">In&nbsp;[8]:</div>
12108+
<div class="inner_cell">
12109+
<div class="input_area">
12110+
<div class=" highlight hl-ipython3"><pre><span></span><span class="k">class</span> <span class="nc">Person</span><span class="p">:</span>
12111+
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">age</span><span class="p">):</span>
12112+
<span class="bp">self</span><span class="o">.</span><span class="n">_age</span> <span class="o">=</span> <span class="n">age</span>
12113+
12114+
<span class="nd">@property</span>
12115+
<span class="k">def</span> <span class="nf">age</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
12116+
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_age</span>
12117+
12118+
<span class="n">example_person</span> <span class="o">=</span> <span class="n">Person</span><span class="p">(</span><span class="n">age</span><span class="o">=</span><span class="mi">15</span><span class="p">)</span>
12119+
<span class="c1"># Now you can do this:</span>
12120+
<span class="nb">print</span><span class="p">(</span><span class="n">example_person</span><span class="o">.</span><span class="n">age</span><span class="p">)</span>
12121+
<span class="c1"># But not this:</span>
12122+
<span class="c1">#example_person.age = 16</span>
12123+
</pre></div>
12124+
12125+
</div>
12126+
</div>
12127+
</div>
12128+
12129+
<div class="output_wrapper">
12130+
<div class="output">
12131+
12132+
12133+
<div class="output_area">
12134+
12135+
<div class="prompt"></div>
12136+
12137+
12138+
<div class="output_subarea output_stream output_stdout output_text">
12139+
<pre>15
12140+
</pre>
12141+
</div>
12142+
</div>
12143+
12144+
</div>
12145+
</div>
12146+
12147+
</div>
12148+
<div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
12149+
</div>
12150+
<div class="inner_cell">
12151+
<div class="text_cell_render border-box-sizing rendered_html">
12152+
<p>This way you can have a controlled access to the instance variables of your class:</p>
12153+
12154+
</div>
12155+
</div>
12156+
</div>
12157+
<div class="cell border-box-sizing code_cell rendered">
12158+
<div class="input">
12159+
<div class="prompt input_prompt">In&nbsp;[9]:</div>
12160+
<div class="inner_cell">
12161+
<div class="input_area">
12162+
<div class=" highlight hl-ipython3"><pre><span></span><span class="k">class</span> <span class="nc">Person</span><span class="p">:</span>
12163+
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">age</span><span class="p">):</span>
12164+
<span class="bp">self</span><span class="o">.</span><span class="n">_age</span> <span class="o">=</span> <span class="n">age</span>
12165+
12166+
<span class="nd">@property</span>
12167+
<span class="k">def</span> <span class="nf">age</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
12168+
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_age</span>
12169+
12170+
<span class="k">def</span> <span class="nf">celebrate_birthday</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
12171+
<span class="bp">self</span><span class="o">.</span><span class="n">_age</span> <span class="o">+=</span> <span class="mi">1</span>
12172+
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Happy bday for </span><span class="si">{}</span><span class="s1"> years old!&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_age</span><span class="p">))</span>
12173+
12174+
<span class="n">example_person</span> <span class="o">=</span> <span class="n">Person</span><span class="p">(</span><span class="n">age</span><span class="o">=</span><span class="mi">15</span><span class="p">)</span>
12175+
<span class="n">example_person</span><span class="o">.</span><span class="n">celebrate_birthday</span><span class="p">()</span>
12176+
</pre></div>
12177+
12178+
</div>
12179+
</div>
12180+
</div>
12181+
12182+
<div class="output_wrapper">
12183+
<div class="output">
12184+
12185+
12186+
<div class="output_area">
12187+
12188+
<div class="prompt"></div>
12189+
12190+
12191+
<div class="output_subarea output_stream output_stdout output_text">
12192+
<pre>Happy bday for 16 years old!
12193+
</pre>
12194+
</div>
12195+
</div>
12196+
12197+
</div>
12198+
</div>
12199+
12200+
</div>
12201+
<div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
12202+
</div>
12203+
<div class="inner_cell">
12204+
<div class="text_cell_render border-box-sizing rendered_html">
12205+
<h2 id="Introduction-to-inheritance">Introduction to inheritance<a class="anchor-link" href="#Introduction-to-inheritance">&#182;</a></h2>
12206+
</div>
12207+
</div>
12208+
</div>
12209+
<div class="cell border-box-sizing code_cell rendered">
12210+
<div class="input">
12211+
<div class="prompt input_prompt">In&nbsp;[10]:</div>
12212+
<div class="inner_cell">
12213+
<div class="input_area">
12214+
<div class=" highlight hl-ipython3"><pre><span></span><span class="k">class</span> <span class="nc">Animal</span><span class="p">:</span>
12215+
<span class="k">def</span> <span class="nf">greet</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
12216+
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Hello, I am an animal&#39;</span><span class="p">)</span>
12217+
12218+
<span class="nd">@property</span>
12219+
<span class="k">def</span> <span class="nf">favorite_food</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
12220+
<span class="k">return</span> <span class="s1">&#39;beef&#39;</span>
12221+
12222+
12223+
<span class="k">class</span> <span class="nc">Dog</span><span class="p">(</span><span class="n">Animal</span><span class="p">):</span>
12224+
<span class="k">def</span> <span class="nf">greet</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
12225+
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;wof wof&#39;</span><span class="p">)</span>
12226+
12227+
12228+
<span class="k">class</span> <span class="nc">Cat</span><span class="p">(</span><span class="n">Animal</span><span class="p">):</span>
12229+
<span class="nd">@property</span>
12230+
<span class="k">def</span> <span class="nf">favorite_food</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
12231+
<span class="k">return</span> <span class="s1">&#39;fish&#39;</span>
12232+
</pre></div>
12233+
12234+
</div>
12235+
</div>
12236+
</div>
12237+
12238+
</div>
12239+
<div class="cell border-box-sizing code_cell rendered">
12240+
<div class="input">
12241+
<div class="prompt input_prompt">In&nbsp;[11]:</div>
12242+
<div class="inner_cell">
12243+
<div class="input_area">
12244+
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">dog</span> <span class="o">=</span> <span class="n">Dog</span><span class="p">()</span>
12245+
<span class="n">dog</span><span class="o">.</span><span class="n">greet</span><span class="p">()</span>
12246+
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Dog&#39;s favorite food is </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">dog</span><span class="o">.</span><span class="n">favorite_food</span><span class="p">))</span>
12247+
12248+
<span class="n">cat</span> <span class="o">=</span> <span class="n">Cat</span><span class="p">()</span>
12249+
<span class="n">cat</span><span class="o">.</span><span class="n">greet</span><span class="p">()</span>
12250+
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Cat&#39;s favorite food is </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">cat</span><span class="o">.</span><span class="n">favorite_food</span><span class="p">))</span>
12251+
</pre></div>
12252+
12253+
</div>
12254+
</div>
12255+
</div>
12256+
12257+
<div class="output_wrapper">
12258+
<div class="output">
12259+
12260+
12261+
<div class="output_area">
12262+
12263+
<div class="prompt"></div>
12264+
12265+
12266+
<div class="output_subarea output_stream output_stdout output_text">
12267+
<pre>wof wof
12268+
Dog&#39;s favorite food is beef
12269+
Hello, I am an animal
12270+
Cat&#39;s favorite food is fish
12271+
</pre>
12272+
</div>
12273+
</div>
12274+
12275+
</div>
12276+
</div>
12277+
1206412278
</div>
1206512279
</div>
1206612280
</div>

0 commit comments

Comments
 (0)