Would you like to inspect the original subtitles? These are the user uploaded subtitles that are being translated:
1
00:00:00,080 --> 00:00:01,920
it's important for software developers
2
00:00:01,920 --> 00:00:03,760
to understand object-oriented
3
00:00:03,760 --> 00:00:04,880
programming
4
00:00:04,880 --> 00:00:06,960
in this course jim from gym-shaped
5
00:00:06,960 --> 00:00:08,559
coding will teach you all about
6
00:00:08,559 --> 00:00:10,880
object-oriented programming in python
7
00:00:10,880 --> 00:00:12,639
object-oriented programming it could be
8
00:00:12,639 --> 00:00:14,719
what is holding you back from being a
9
00:00:14,719 --> 00:00:17,279
great python developer and as well as
10
00:00:17,279 --> 00:00:19,920
landing your first job as a software
11
00:00:19,920 --> 00:00:21,039
engineer
12
00:00:21,039 --> 00:00:23,039
welcome everyone to python
13
00:00:23,039 --> 00:00:25,599
object-oriented programming course now
14
00:00:25,599 --> 00:00:27,279
if you struggle to understand the
15
00:00:27,279 --> 00:00:29,279
concepts of object-oriented programming
16
00:00:29,279 --> 00:00:31,439
in the past then you are totally fine
17
00:00:31,439 --> 00:00:33,200
and you are in good hands because in
18
00:00:33,200 --> 00:00:36,239
this course i'm going to make sure that
19
00:00:36,239 --> 00:00:37,920
this will be the last tutorial that you
20
00:00:37,920 --> 00:00:41,120
will ever watch about classes and the
21
00:00:41,120 --> 00:00:43,840
complex concepts that comes with object
22
00:00:43,840 --> 00:00:46,160
oriented programming and we are going to
23
00:00:46,160 --> 00:00:48,559
do this by developing a real python
24
00:00:48,559 --> 00:00:51,039
application that is going to be very
25
00:00:51,039 --> 00:00:53,920
cool to write and we will add to its
26
00:00:53,920 --> 00:00:56,879
complexity step by step and throughout
27
00:00:56,879 --> 00:00:58,559
the way we will understand everything
28
00:00:58,559 --> 00:01:00,239
that we need to know about
29
00:01:00,239 --> 00:01:02,320
object-oriented programming now there
30
00:01:02,320 --> 00:01:04,000
are going to be some requirements to
31
00:01:04,000 --> 00:01:06,320
this course i do expect from everybody
32
00:01:06,320 --> 00:01:08,479
to know at least about functions
33
00:01:08,479 --> 00:01:11,040
variables if statements and as well as
34
00:01:11,040 --> 00:01:13,520
for loops and if you know those things
35
00:01:13,520 --> 00:01:15,600
from other programming languages then
36
00:01:15,600 --> 00:01:17,759
this is also fine so with that being
37
00:01:17,759 --> 00:01:20,400
said let's get started now to explain
38
00:01:20,400 --> 00:01:22,080
why you should write object oriented
39
00:01:22,080 --> 00:01:24,400
programs i will explain the concepts
40
00:01:24,400 --> 00:01:26,560
based on a store management system that
41
00:01:26,560 --> 00:01:28,880
we will start developing together so
42
00:01:28,880 --> 00:01:30,720
starting to think about how to take our
43
00:01:30,720 --> 00:01:33,040
first steps with such a program we could
44
00:01:33,040 --> 00:01:34,720
first think about tracking after the
45
00:01:34,720 --> 00:01:36,640
items that we have right now in our
46
00:01:36,640 --> 00:01:39,200
store so one way we could get started we
47
00:01:39,200 --> 00:01:41,280
could create those four variables to
48
00:01:41,280 --> 00:01:43,840
start tracking after our items so as you
49
00:01:43,840 --> 00:01:46,079
can see we have our first variable item
50
00:01:46,079 --> 00:01:48,079
one equals to phone and then we have
51
00:01:48,079 --> 00:01:49,840
three more variables that are
52
00:01:49,840 --> 00:01:51,759
intentionally starting with the prefix
53
00:01:51,759 --> 00:01:54,320
of item one so that we could describe
54
00:01:54,320 --> 00:01:56,560
that those four variables are related to
55
00:01:56,560 --> 00:01:58,799
each other by following the correct
56
00:01:58,799 --> 00:02:00,960
naming conventions now you might think
57
00:02:00,960 --> 00:02:02,960
that those four variables are related to
58
00:02:02,960 --> 00:02:05,280
each other only because it uses the same
59
00:02:05,280 --> 00:02:08,239
prefix of item one for python those are
60
00:02:08,239 --> 00:02:10,560
just four variables with different data
61
00:02:10,560 --> 00:02:13,760
types so if we were to print the type
62
00:02:13,760 --> 00:02:16,239
for each of those four variables now we
63
00:02:16,239 --> 00:02:19,040
would receive their types with no
64
00:02:19,040 --> 00:02:21,920
surprises right we will receive string
65
00:02:21,920 --> 00:02:24,400
and integer for price quantity and price
66
00:02:24,400 --> 00:02:26,879
total now i want to focus on those
67
00:02:26,879 --> 00:02:29,200
specific outputs right now because as
68
00:02:29,200 --> 00:02:31,680
you can see for each of the types we
69
00:02:31,680 --> 00:02:35,200
also see the keyword of class now this
70
00:02:35,200 --> 00:02:39,120
means that those data types are actually
71
00:02:39,120 --> 00:02:43,360
instances of strings or integers so in
72
00:02:43,360 --> 00:02:45,760
python programming language each data
73
00:02:45,760 --> 00:02:47,920
type is an object that has been
74
00:02:47,920 --> 00:02:51,519
instantiated earlier by some class and
75
00:02:51,519 --> 00:02:54,400
for the item1 variable that has been
76
00:02:54,400 --> 00:02:57,440
instantiated from a string type of class
77
00:02:57,440 --> 00:02:59,440
and for the price quantity and price
78
00:02:59,440 --> 00:03:02,239
total those have been instantiated from
79
00:03:02,239 --> 00:03:04,959
a class that is named int meaning
80
00:03:04,959 --> 00:03:07,840
integer so it could have been nicer if
81
00:03:07,840 --> 00:03:10,239
we could tell python that we want to
82
00:03:10,239 --> 00:03:12,720
create a data type of our own it will
83
00:03:12,720 --> 00:03:14,640
allow us to write a code that we can
84
00:03:14,640 --> 00:03:17,840
reuse in the future easily if needed now
85
00:03:17,840 --> 00:03:20,000
each instance could have attributes to
86
00:03:20,000 --> 00:03:22,400
describe related information about it
87
00:03:22,400 --> 00:03:24,480
and we can think about at least some
88
00:03:24,480 --> 00:03:26,959
good candidates for attributes we could
89
00:03:26,959 --> 00:03:30,400
have for our item data type like its
90
00:03:30,400 --> 00:03:31,200
name
91
00:03:31,200 --> 00:03:34,080
price or quantity all right so let's go
92
00:03:34,080 --> 00:03:36,319
ahead and start creating our first class
93
00:03:36,319 --> 00:03:38,560
so i will clean everything from here and
94
00:03:38,560 --> 00:03:40,400
we'll go ahead with it so it is going to
95
00:03:40,400 --> 00:03:42,560
be divided into two parts the first one
96
00:03:42,560 --> 00:03:44,720
will be the creation of the class and
97
00:03:44,720 --> 00:03:47,280
the second one will be the part that i
98
00:03:47,280 --> 00:03:49,920
will instantiate some objects of this
99
00:03:49,920 --> 00:03:52,239
class now when i say creating an
100
00:03:52,239 --> 00:03:54,720
instance or creating an object basically
101
00:03:54,720 --> 00:03:56,799
i mean to the same thing so you might
102
00:03:56,799 --> 00:03:59,280
hear me saying one of those all right so
103
00:03:59,280 --> 00:04:01,920
let's go ahead and say class and then
104
00:04:01,920 --> 00:04:04,159
this needs to be followed by the name of
105
00:04:04,159 --> 00:04:06,080
the class that you want to create so we
106
00:04:06,080 --> 00:04:08,400
would like to give it the name of item
107
00:04:08,400 --> 00:04:10,640
and then inside of this class in the
108
00:04:10,640 --> 00:04:13,280
future we are going to write some code
109
00:04:13,280 --> 00:04:15,439
that will be very beneficial and very
110
00:04:15,439 --> 00:04:17,839
useful for us so we won't repeat
111
00:04:17,839 --> 00:04:19,839
ourselves every time that we like to
112
00:04:19,839 --> 00:04:22,400
take similar actions but for now
113
00:04:22,400 --> 00:04:24,560
temporarily i'm going to say here pass
114
00:04:24,560 --> 00:04:26,800
so we will not receive any errors inside
115
00:04:26,800 --> 00:04:28,960
this class definition all right so now
116
00:04:28,960 --> 00:04:31,120
that we have created our class then we
117
00:04:31,120 --> 00:04:32,960
are allowed to create some instances of
118
00:04:32,960 --> 00:04:34,960
this class so let's go ahead and say
119
00:04:34,960 --> 00:04:38,639
item one is equal to item and that
120
00:04:38,639 --> 00:04:41,120
action is equivalent to creating an
121
00:04:41,120 --> 00:04:43,600
instance of a class just like if you
122
00:04:43,600 --> 00:04:46,080
were to create a random string
123
00:04:46,080 --> 00:04:48,160
then you will say something like the
124
00:04:48,160 --> 00:04:51,280
following this is equivalent to this one
125
00:04:51,280 --> 00:04:53,280
as well so it is very important to
126
00:04:53,280 --> 00:04:56,080
understand how classes are working in
127
00:04:56,080 --> 00:04:57,840
python so i will delete this line
128
00:04:57,840 --> 00:05:00,720
because this was just for an example and
129
00:05:00,720 --> 00:05:02,960
now i said that we are allowed to assign
130
00:05:02,960 --> 00:05:05,759
some attributes to instances of a class
131
00:05:05,759 --> 00:05:08,160
so let's go ahead and start creating
132
00:05:08,160 --> 00:05:10,639
attributes and that will be achievable
133
00:05:10,639 --> 00:05:13,919
by using the dot sign right after the
134
00:05:13,919 --> 00:05:16,320
instance of a class and here you can say
135
00:05:16,320 --> 00:05:17,919
that you want to give it an attribute
136
00:05:17,919 --> 00:05:21,199
like a name that will be equal to phone
137
00:05:21,199 --> 00:05:24,479
and item1.price could be equal to
138
00:05:24,479 --> 00:05:28,880
100 and item one dot quantity could be
139
00:05:28,880 --> 00:05:29,919
equal to
140
00:05:29,919 --> 00:05:32,720
five for example now in that stage you
141
00:05:32,720 --> 00:05:34,479
might ask yourself what is the
142
00:05:34,479 --> 00:05:36,560
difference between the random variables
143
00:05:36,560 --> 00:05:39,120
that we have created to those four lines
144
00:05:39,120 --> 00:05:40,720
well here we actually have a
145
00:05:40,720 --> 00:05:43,440
relationship between those four lines
146
00:05:43,440 --> 00:05:45,680
because each one of the attributes are
147
00:05:45,680 --> 00:05:48,479
assigned to one instance of the class
148
00:05:48,479 --> 00:05:50,800
and i could preview this by going ahead
149
00:05:50,800 --> 00:05:54,560
and try to print the types of item one
150
00:05:54,560 --> 00:05:57,280
now and as well as the types of the
151
00:05:57,280 --> 00:05:58,960
attributes of
152
00:05:58,960 --> 00:06:01,520
name price and quantity now with name
153
00:06:01,520 --> 00:06:03,120
price and quantity we are not going to
154
00:06:03,120 --> 00:06:05,520
have any surprises because we assigned
155
00:06:05,520 --> 00:06:08,240
string type attributes to the item
156
00:06:08,240 --> 00:06:11,440
object but if we were to print that then
157
00:06:11,440 --> 00:06:13,600
check out the result if i was to run
158
00:06:13,600 --> 00:06:16,720
this program so you can see that now we
159
00:06:16,720 --> 00:06:19,520
have a data type of item here and that
160
00:06:19,520 --> 00:06:21,199
is the big difference between what we
161
00:06:21,199 --> 00:06:23,120
have seen previously to this thing that
162
00:06:23,120 --> 00:06:25,520
we have just created so now we
163
00:06:25,520 --> 00:06:27,199
understand how we can create our own
164
00:06:27,199 --> 00:06:29,440
data types now let's go ahead and see
165
00:06:29,440 --> 00:06:32,160
what are the rest of the benefits using
166
00:06:32,160 --> 00:06:34,400
object oriented programming okay so
167
00:06:34,400 --> 00:06:36,400
until now we understood how to assign
168
00:06:36,400 --> 00:06:39,199
attributes to instances we should also
169
00:06:39,199 --> 00:06:41,280
understand now how we can create some
170
00:06:41,280 --> 00:06:43,840
methods and execute them on our
171
00:06:43,840 --> 00:06:46,000
instances now if we will take as an
172
00:06:46,000 --> 00:06:48,800
example the built-in class of string
173
00:06:48,800 --> 00:06:50,720
then you know that we have some methods
174
00:06:50,720 --> 00:06:52,800
that we can go ahead and execute for
175
00:06:52,800 --> 00:06:55,599
each of our strings and for this example
176
00:06:55,599 --> 00:06:57,840
you can see that i grab an instance of a
177
00:06:57,840 --> 00:07:00,880
string that i named random str and then
178
00:07:00,880 --> 00:07:02,720
i go ahead in the next line and execute
179
00:07:02,720 --> 00:07:04,880
the upper method which if you remember
180
00:07:04,880 --> 00:07:07,360
is responsible to grab all the letters
181
00:07:07,360 --> 00:07:09,840
and turn them to uppercase now the
182
00:07:09,840 --> 00:07:11,759
biggest question here is how we can go
183
00:07:11,759 --> 00:07:14,800
ahead and design some methods that are
184
00:07:14,800 --> 00:07:16,880
going to be allowed to execute on our
185
00:07:16,880 --> 00:07:19,840
instances well the answer is inside our
186
00:07:19,840 --> 00:07:23,280
class so we could go inside our class
187
00:07:23,280 --> 00:07:25,199
and write some methods that will be
188
00:07:25,199 --> 00:07:28,720
accessible from our instances so we
189
00:07:28,720 --> 00:07:31,599
could go ahead and say def
190
00:07:31,599 --> 00:07:34,400
and give our method a name now a good
191
00:07:34,400 --> 00:07:36,080
candidate for a method that we'd like to
192
00:07:36,080 --> 00:07:39,759
create now is actually calculate total
193
00:07:39,759 --> 00:07:42,000
price because as we understand it could
194
00:07:42,000 --> 00:07:43,759
have been nice if we were to have a
195
00:07:43,759 --> 00:07:45,840
method that will go ahead and calculate
196
00:07:45,840 --> 00:07:49,639
the result multiplying item1.price with
197
00:07:49,639 --> 00:07:52,400
item1.quantity so we can get the total
198
00:07:52,400 --> 00:07:54,879
price for that specific item now before
199
00:07:54,879 --> 00:07:57,360
we go ahead and complete this function
200
00:07:57,360 --> 00:07:59,199
then i'm going to just create one more
201
00:07:59,199 --> 00:08:01,919
instance of this item by also deleting
202
00:08:01,919 --> 00:08:03,680
those two lines because we understood
203
00:08:03,680 --> 00:08:05,599
the example so i'm just going to change
204
00:08:05,599 --> 00:08:07,599
those to item 2
205
00:08:07,599 --> 00:08:10,080
like that and i'm going to use something
206
00:08:10,080 --> 00:08:10,960
like
207
00:08:10,960 --> 00:08:13,919
laptop and change the price to 1000 and
208
00:08:13,919 --> 00:08:16,879
say that we have three of those now just
209
00:08:16,879 --> 00:08:18,479
a quick side note when you will hear me
210
00:08:18,479 --> 00:08:21,199
say methods then i basically mean to
211
00:08:21,199 --> 00:08:23,520
functions that are inside classes
212
00:08:23,520 --> 00:08:25,759
because in terms of python or in any
213
00:08:25,759 --> 00:08:27,360
programming language when you have
214
00:08:27,360 --> 00:08:30,720
isolated definitions with this keyword
215
00:08:30,720 --> 00:08:32,559
then those are considered to be called
216
00:08:32,559 --> 00:08:34,399
functions but when you go ahead and
217
00:08:34,399 --> 00:08:37,279
create those functions inside classes
218
00:08:37,279 --> 00:08:39,919
then those are called methods so that is
219
00:08:39,919 --> 00:08:41,679
an important point that you should
220
00:08:41,679 --> 00:08:43,440
understand because i'm going to call
221
00:08:43,440 --> 00:08:46,080
those methods from now okay so now if i
222
00:08:46,080 --> 00:08:48,560
was to continue by opening up and
223
00:08:48,560 --> 00:08:50,640
closing those parentheses then you are
224
00:08:50,640 --> 00:08:53,040
going to see one parameter that is
225
00:08:53,040 --> 00:08:55,680
generated that python wants us to
226
00:08:55,680 --> 00:08:57,839
receive intentionally now the reason
227
00:08:57,839 --> 00:08:59,360
that this happens
228
00:08:59,360 --> 00:09:00,480
python
229
00:09:00,480 --> 00:09:03,600
passes the object itself as a first
230
00:09:03,600 --> 00:09:06,160
argument when you go ahead and call
231
00:09:06,160 --> 00:09:10,080
those methods now if i was to go here
232
00:09:10,080 --> 00:09:14,240
and say item1 dot calculate total price
233
00:09:14,240 --> 00:09:16,640
then the action that we are doing now is
234
00:09:16,640 --> 00:09:18,560
calling this method but when you go
235
00:09:18,560 --> 00:09:21,839
ahead and call a method from an instance
236
00:09:21,839 --> 00:09:25,600
then python passes the object itself as
237
00:09:25,600 --> 00:09:28,399
a first argument every time so that is
238
00:09:28,399 --> 00:09:30,880
why we are not allowed to create methods
239
00:09:30,880 --> 00:09:33,600
that will never receive parameters now
240
00:09:33,600 --> 00:09:36,160
you will see this if i was to remove the
241
00:09:36,160 --> 00:09:38,800
first parameter and say something like
242
00:09:38,800 --> 00:09:42,480
pass now if i was to execute
243
00:09:42,480 --> 00:09:44,560
this program now then you are going to
244
00:09:44,560 --> 00:09:47,839
see type error calculate total price
245
00:09:47,839 --> 00:09:51,440
takes 0 positional arguments but one was
246
00:09:51,440 --> 00:09:53,920
given so in simple words what this
247
00:09:53,920 --> 00:09:57,120
exception says is that python tries to
248
00:09:57,120 --> 00:09:59,600
pass one argument and you are not
249
00:09:59,600 --> 00:10:01,839
receiving any parameter so that is very
250
00:10:01,839 --> 00:10:04,640
problematic and that is why you always
251
00:10:04,640 --> 00:10:07,040
have to receive at least one parameter
252
00:10:07,040 --> 00:10:08,320
when you go ahead and create your
253
00:10:08,320 --> 00:10:11,760
methods now since we always receive this
254
00:10:11,760 --> 00:10:14,079
parameter then it is just a common
255
00:10:14,079 --> 00:10:17,040
approach to call this self it was okay
256
00:10:17,040 --> 00:10:19,279
if i was to call it something like my
257
00:10:19,279 --> 00:10:22,240
param or i don't know something else but
258
00:10:22,240 --> 00:10:24,320
you never want to mess up with common
259
00:10:24,320 --> 00:10:26,399
conventions across different python
260
00:10:26,399 --> 00:10:28,640
developers so that is why just make sure
261
00:10:28,640 --> 00:10:32,399
that you leave it as self every time now
262
00:10:32,399 --> 00:10:35,120
if i was to go ahead and
263
00:10:35,120 --> 00:10:36,959
run this program then you're gonna see
264
00:10:36,959 --> 00:10:38,480
that we are not going to receive any
265
00:10:38,480 --> 00:10:40,240
errors so this means that this method
266
00:10:40,240 --> 00:10:42,800
has been implemented correctly now let's
267
00:10:42,800 --> 00:10:44,800
see how we are going to benefit from
268
00:10:44,800 --> 00:10:46,880
creating this method because it should
269
00:10:46,880 --> 00:10:49,680
go ahead and create a calculation for us
270
00:10:49,680 --> 00:10:52,480
using price and quantity so i will
271
00:10:52,480 --> 00:10:54,880
intentionally receive here two more
272
00:10:54,880 --> 00:10:57,200
parameters which we could name just x
273
00:10:57,200 --> 00:10:59,920
and y for now and we could just say
274
00:10:59,920 --> 00:11:04,240
return x multiplied by y and now i will
275
00:11:04,240 --> 00:11:06,640
go ahead and pass in here two additional
276
00:11:06,640 --> 00:11:11,279
arguments and it will be item1.price
277
00:11:11,279 --> 00:11:14,240
the second one will be quantity so that
278
00:11:14,240 --> 00:11:16,079
is going to work because when you call
279
00:11:16,079 --> 00:11:18,640
this method in the background python
280
00:11:18,640 --> 00:11:20,959
passes this as an argument and then it
281
00:11:20,959 --> 00:11:23,360
passes this second argument and then
282
00:11:23,360 --> 00:11:25,360
this has been passed as a third argument
283
00:11:25,360 --> 00:11:27,519
so that is perfect and if i was to run
284
00:11:27,519 --> 00:11:30,480
that and actually print this so excuse
285
00:11:30,480 --> 00:11:31,760
me for running this
286
00:11:31,760 --> 00:11:34,240
before printing it so i will
287
00:11:34,240 --> 00:11:36,160
surround this
288
00:11:36,160 --> 00:11:38,240
expression with this print built-in
289
00:11:38,240 --> 00:11:40,160
function and i will run that and you're
290
00:11:40,160 --> 00:11:43,440
gonna see 500 as expected now i could do
291
00:11:43,440 --> 00:11:46,000
the exact same thing for calculating the
292
00:11:46,000 --> 00:11:49,360
total price of our second item so if i
293
00:11:49,360 --> 00:11:52,560
was to grab this and paste this in in
294
00:11:52,560 --> 00:11:55,040
this line and actually change this to
295
00:11:55,040 --> 00:11:58,639
item two and change this one to item two
296
00:11:58,639 --> 00:12:01,120
and as well as this one then i will
297
00:12:01,120 --> 00:12:02,639
receive
298
00:12:02,639 --> 00:12:05,519
three thousand as expected and that is
299
00:12:05,519 --> 00:12:07,600
how you can create a metal alright so
300
00:12:07,600 --> 00:12:09,680
until that point we understood that we
301
00:12:09,680 --> 00:12:11,680
can assign attributes and as well as
302
00:12:11,680 --> 00:12:14,000
creating some methods that we can go
303
00:12:14,000 --> 00:12:16,000
ahead and use them from our instances
304
00:12:16,000 --> 00:12:19,279
directly like those two examples in that
305
00:12:19,279 --> 00:12:22,560
line and as well as in that line now in
306
00:12:22,560 --> 00:12:24,560
that episode we are going to solve some
307
00:12:24,560 --> 00:12:26,639
more problems that we have in terms of
308
00:12:26,639 --> 00:12:28,480
best practices in object-oriented
309
00:12:28,480 --> 00:12:30,160
programming and things that you are
310
00:12:30,160 --> 00:12:32,079
going to see in each project that is
311
00:12:32,079 --> 00:12:34,720
based on oop all right so let's get
312
00:12:34,720 --> 00:12:36,480
started now one of the first problems
313
00:12:36,480 --> 00:12:38,800
that we have here is the fact that we
314
00:12:38,800 --> 00:12:41,279
don't have a set of rules for the
315
00:12:41,279 --> 00:12:43,040
attributes that you would like to pass
316
00:12:43,040 --> 00:12:44,880
in in order to instantiate an instance
317
00:12:44,880 --> 00:12:47,040
successfully and what that means it
318
00:12:47,040 --> 00:12:49,360
means that for each item that i want to
319
00:12:49,360 --> 00:12:51,600
go ahead and create i need to hard code
320
00:12:51,600 --> 00:12:53,519
in the attribute name
321
00:12:53,519 --> 00:12:56,639
like those in here and it could have
322
00:12:56,639 --> 00:12:59,200
been nicer if we could somehow declare
323
00:12:59,200 --> 00:13:01,040
in the class that in order to
324
00:13:01,040 --> 00:13:03,519
instantiate an instance successfully
325
00:13:03,519 --> 00:13:06,959
name price and quantity must be passed
326
00:13:06,959 --> 00:13:08,880
otherwise the instance could not have
327
00:13:08,880 --> 00:13:11,200
been created successfully so what that
328
00:13:11,200 --> 00:13:13,519
means it means that it could have been a
329
00:13:13,519 --> 00:13:16,560
great option if we could somehow execute
330
00:13:16,560 --> 00:13:19,040
something in the background this second
331
00:13:19,040 --> 00:13:21,519
that we instantiate an instance and
332
00:13:21,519 --> 00:13:24,000
there is a way that you can reach such a
333
00:13:24,000 --> 00:13:26,399
behavior and that is by creating a
334
00:13:26,399 --> 00:13:28,959
special method with a very unique name
335
00:13:28,959 --> 00:13:31,120
which is called double underscore init
336
00:13:31,120 --> 00:13:33,760
double underscore now you might hear
337
00:13:33,760 --> 00:13:35,920
this term as well as called as
338
00:13:35,920 --> 00:13:38,639
constructor basically that is a method
339
00:13:38,639 --> 00:13:41,199
with a unique name that you need to call
340
00:13:41,199 --> 00:13:44,000
it the way it is intentionally in order
341
00:13:44,000 --> 00:13:47,279
to use its special features now the way
342
00:13:47,279 --> 00:13:49,440
that this is going to work is by
343
00:13:49,440 --> 00:13:50,720
creating
344
00:13:50,720 --> 00:13:52,959
it the following way so it will be
345
00:13:52,959 --> 00:13:56,079
double underscore and as you can see i
346
00:13:56,079 --> 00:13:58,079
already have auto completion for some
347
00:13:58,079 --> 00:14:00,639
very special methods that are starting
348
00:14:00,639 --> 00:14:03,120
and ending with double underscore now
349
00:14:03,120 --> 00:14:06,160
the collection of those methods are used
350
00:14:06,160 --> 00:14:08,480
to be called magic methods and we are
351
00:14:08,480 --> 00:14:10,399
going to learn a lot of more magic
352
00:14:10,399 --> 00:14:13,680
methods that you have in oop but the
353
00:14:13,680 --> 00:14:15,120
first one that we are going to start
354
00:14:15,120 --> 00:14:18,399
with will be the init double underscore
355
00:14:18,399 --> 00:14:20,560
like that all right so now that we have
356
00:14:20,560 --> 00:14:22,880
created this method then let's actually
357
00:14:22,880 --> 00:14:24,480
see what this method does in the
358
00:14:24,480 --> 00:14:26,399
background so when you go ahead and
359
00:14:26,399 --> 00:14:29,040
create an instance of a class then
360
00:14:29,040 --> 00:14:31,440
python executes this double underscore
361
00:14:31,440 --> 00:14:34,320
init function automatically so what that
362
00:14:34,320 --> 00:14:36,560
means it means that now that we have
363
00:14:36,560 --> 00:14:38,959
declared our class python is going to
364
00:14:38,959 --> 00:14:41,360
run through this line and then since an
365
00:14:41,360 --> 00:14:43,760
instance has been created and we have
366
00:14:43,760 --> 00:14:46,160
double score init method designed then
367
00:14:46,160 --> 00:14:48,399
it is going to call the actions that are
368
00:14:48,399 --> 00:14:50,480
inside this double underscore init
369
00:14:50,480 --> 00:14:52,880
double underscore method now in order to
370
00:14:52,880 --> 00:14:55,360
prove you that then i'm going to start
371
00:14:55,360 --> 00:14:58,079
with a very basic print here that will
372
00:14:58,079 --> 00:15:00,399
say i am created
373
00:15:00,399 --> 00:15:04,079
like that now we got here one instance
374
00:15:04,079 --> 00:15:06,720
and here we got another one so we should
375
00:15:06,720 --> 00:15:09,360
see i am created twice and in order to
376
00:15:09,360 --> 00:15:11,199
avoid confusions then i'm going to
377
00:15:11,199 --> 00:15:13,920
delete those print lines from here so we
378
00:15:13,920 --> 00:15:16,959
can see a cleaner picture all right so
379
00:15:16,959 --> 00:15:19,279
if we were to run our program then you
380
00:15:19,279 --> 00:15:21,920
can see that we have im created twice
381
00:15:21,920 --> 00:15:24,560
and that is because python called this
382
00:15:24,560 --> 00:15:26,160
double underscore init double underscore
383
00:15:26,160 --> 00:15:28,480
method twice thanks to those two
384
00:15:28,480 --> 00:15:30,480
instances that we have created all right
385
00:15:30,480 --> 00:15:32,160
so now that we use the double underscore
386
00:15:32,160 --> 00:15:34,160
init function in this class we should
387
00:15:34,160 --> 00:15:36,480
take benefit from it and solve some more
388
00:15:36,480 --> 00:15:39,040
problems in order to implement oop best
389
00:15:39,040 --> 00:15:41,120
practices now if you remember in the
390
00:15:41,120 --> 00:15:43,120
beginning of this tutorial i said that
391
00:15:43,120 --> 00:15:44,800
one of the problems that we have till
392
00:15:44,800 --> 00:15:46,959
this point is the fact that we still
393
00:15:46,959 --> 00:15:49,519
hard code in the attributes in that way
394
00:15:49,519 --> 00:15:52,079
by saying dot name dot price dot
395
00:15:52,079 --> 00:15:54,639
quantity and that is something that we
396
00:15:54,639 --> 00:15:57,519
can for sure avoid now let's see how we
397
00:15:57,519 --> 00:15:59,519
can start avoiding creating those
398
00:15:59,519 --> 00:16:01,440
attributes hard-coded for each of the
399
00:16:01,440 --> 00:16:03,279
instances here so we can actually
400
00:16:03,279 --> 00:16:04,959
benefit from the double underscore init
401
00:16:04,959 --> 00:16:06,959
method that we have designed and let's
402
00:16:06,959 --> 00:16:09,759
see how now we understand that for each
403
00:16:09,759 --> 00:16:12,000
instance that we will create it will go
404
00:16:12,000 --> 00:16:13,519
ahead and call this double underscore
405
00:16:13,519 --> 00:16:16,000
init method automatically so what that
406
00:16:16,000 --> 00:16:18,720
means it means that not only we can
407
00:16:18,720 --> 00:16:20,320
allow ourselves to receive the sales
408
00:16:20,320 --> 00:16:22,160
parameter because this is a mandatory
409
00:16:22,160 --> 00:16:24,000
thing that we should do because python
410
00:16:24,000 --> 00:16:26,399
in the background passes the instance
411
00:16:26,399 --> 00:16:28,959
itself as a first argument we could in
412
00:16:28,959 --> 00:16:32,000
addition take some more parameters and
413
00:16:32,000 --> 00:16:34,560
then do something with them so as a
414
00:16:34,560 --> 00:16:36,639
starter let's say that we would like to
415
00:16:36,639 --> 00:16:38,560
receive one more parameter that we could
416
00:16:38,560 --> 00:16:41,120
name it name and as you can see
417
00:16:41,120 --> 00:16:43,120
automatically python is going to
418
00:16:43,120 --> 00:16:46,320
complain how the name argument is not
419
00:16:46,320 --> 00:16:48,240
filled in here so
420
00:16:48,240 --> 00:16:50,720
now i could go ahead and pass in the
421
00:16:50,720 --> 00:16:53,279
argument of phone for that one and for
422
00:16:53,279 --> 00:16:55,519
the second one i can go ahead and pass
423
00:16:55,519 --> 00:16:58,800
in the argument of laptop now once i
424
00:16:58,800 --> 00:17:01,279
have created this then i can actually go
425
00:17:01,279 --> 00:17:03,120
ahead and change my print line a little
426
00:17:03,120 --> 00:17:05,599
bit so it will be a unique print line
427
00:17:05,599 --> 00:17:08,240
where i can identify from where each
428
00:17:08,240 --> 00:17:10,480
print line came from so i can go ahead
429
00:17:10,480 --> 00:17:12,640
and say an instance
430
00:17:12,640 --> 00:17:13,839
created
431
00:17:13,839 --> 00:17:16,720
and use a column here and then refer to
432
00:17:16,720 --> 00:17:19,760
the name like that and now that we have
433
00:17:19,760 --> 00:17:22,480
created this then if we were to run our
434
00:17:22,480 --> 00:17:24,720
program then you're gonna see unique
435
00:17:24,720 --> 00:17:27,039
sentences and instances created for the
436
00:17:27,039 --> 00:17:30,000
phone and as well as for the laptop all
437
00:17:30,000 --> 00:17:32,320
right so now that we have done this then
438
00:17:32,320 --> 00:17:34,000
there is something that is still not
439
00:17:34,000 --> 00:17:36,640
quite perfect because we still pass in
440
00:17:36,640 --> 00:17:40,080
the attribute of name here and here so
441
00:17:40,080 --> 00:17:43,120
now pay attention how the init method
442
00:17:43,120 --> 00:17:45,760
has to receive the self as a perimeter
443
00:17:45,760 --> 00:17:47,760
as well and we already know the reason
444
00:17:47,760 --> 00:17:50,080
for that and the fact that we have self
445
00:17:50,080 --> 00:17:52,320
as a parameter here could actually allow
446
00:17:52,320 --> 00:17:54,480
us to assign the attributes from the
447
00:17:54,480 --> 00:17:57,039
init method so that we will not have to
448
00:17:57,039 --> 00:17:59,039
go ahead and assign the attribute of
449
00:17:59,039 --> 00:18:01,919
name for each of the instances we create
450
00:18:01,919 --> 00:18:04,160
so what that means it means that i can
451
00:18:04,160 --> 00:18:07,039
dynamically assign an attribute to an
452
00:18:07,039 --> 00:18:09,679
instance from this magic method which is
453
00:18:09,679 --> 00:18:12,320
called double underscore init so if i
454
00:18:12,320 --> 00:18:14,880
was to say self
455
00:18:14,880 --> 00:18:18,240
dot name so i'm assigning the attribute
456
00:18:18,240 --> 00:18:21,760
of name to each instance that is going
457
00:18:21,760 --> 00:18:24,640
to be created or created yet and i'm
458
00:18:24,640 --> 00:18:27,520
making that to be equal to the name
459
00:18:27,520 --> 00:18:30,400
that is passed in from here so what that
460
00:18:30,400 --> 00:18:32,720
means it means that now i can allow
461
00:18:32,720 --> 00:18:34,640
myself to delete
462
00:18:34,640 --> 00:18:37,280
this line and then
463
00:18:37,280 --> 00:18:40,160
this line so as you can see now i have a
464
00:18:40,160 --> 00:18:42,880
dynamic attribute assignment thanks to
465
00:18:42,880 --> 00:18:45,280
this self.name equals name that we have
466
00:18:45,280 --> 00:18:47,520
wrote here and to test that the
467
00:18:47,520 --> 00:18:49,679
attribute assignment worked then i can
468
00:18:49,679 --> 00:18:52,080
go down here and use two more lines that
469
00:18:52,080 --> 00:18:53,760
will look like the following so i will
470
00:18:53,760 --> 00:18:55,799
print item
471
00:18:55,799 --> 00:18:59,600
item1.name and i will also print item2
472
00:18:59,600 --> 00:19:02,000
dot name and in order to avoid
473
00:19:02,000 --> 00:19:04,080
confusions then i'm going to get rid of
474
00:19:04,080 --> 00:19:06,480
this line so we could only see the print
475
00:19:06,480 --> 00:19:08,799
lines from here and now if i was to run
476
00:19:08,799 --> 00:19:10,880
that then you can see that we receive
477
00:19:10,880 --> 00:19:13,440
phone and laptop so it means that we
478
00:19:13,440 --> 00:19:15,280
were able to assign the attributes
479
00:19:15,280 --> 00:19:18,080
dynamically and that is perfect and now
480
00:19:18,080 --> 00:19:20,080
that we get the idea of that then we
481
00:19:20,080 --> 00:19:21,840
should also do the same for the rest of
482
00:19:21,840 --> 00:19:24,240
the attributes that we'd like to receive
483
00:19:24,240 --> 00:19:27,120
so we also got the price and quantity to
484
00:19:27,120 --> 00:19:29,919
take care of so i'm going to go to my
485
00:19:29,919 --> 00:19:31,520
init method and i'm going to receive
486
00:19:31,520 --> 00:19:32,400
again
487
00:19:32,400 --> 00:19:33,360
price
488
00:19:33,360 --> 00:19:35,679
and quantity and i'm going to do the
489
00:19:35,679 --> 00:19:37,840
exact same thing so i'm going to assign
490
00:19:37,840 --> 00:19:40,320
the attribute of price and that will be
491
00:19:40,320 --> 00:19:41,440
equal to
492
00:19:41,440 --> 00:19:44,720
price and the quantity will be equal to
493
00:19:44,720 --> 00:19:46,960
the quantity and you can also see that
494
00:19:46,960 --> 00:19:49,200
again python complains about the price
495
00:19:49,200 --> 00:19:51,200
and the quantity not being passed in
496
00:19:51,200 --> 00:19:55,200
here so i can say 100 and then 5
497
00:19:55,200 --> 00:19:57,200
and then i can delete those
498
00:19:57,200 --> 00:19:59,760
and then i can do the same here i could
499
00:19:59,760 --> 00:20:04,640
pass in 1000 and then 3 and delete those
500
00:20:04,640 --> 00:20:06,400
and in order to prove you that this is
501
00:20:06,400 --> 00:20:09,200
going to work then i'm going to copy
502
00:20:09,200 --> 00:20:11,600
myself a couple of times and change this
503
00:20:11,600 --> 00:20:14,720
to quantity i mean
504
00:20:14,720 --> 00:20:16,159
price
505
00:20:16,159 --> 00:20:18,559
this one will be price as well
506
00:20:18,559 --> 00:20:21,280
this one will be quantity and this one
507
00:20:21,280 --> 00:20:23,919
as well and now if i was to run that
508
00:20:23,919 --> 00:20:25,919
then you can see that the results are as
509
00:20:25,919 --> 00:20:27,840
expected so that is a way that you
510
00:20:27,840 --> 00:20:30,320
should work with the double underscore
511
00:20:30,320 --> 00:20:32,559
init method you should always take care
512
00:20:32,559 --> 00:20:34,159
of the attributes that you want to
513
00:20:34,159 --> 00:20:36,559
assign to an object inside the double
514
00:20:36,559 --> 00:20:38,880
underscore init method meaning inside
515
00:20:38,880 --> 00:20:41,039
the constructor now a couple of side
516
00:20:41,039 --> 00:20:42,480
notes that are quite important to
517
00:20:42,480 --> 00:20:45,120
remember when we work with classes now
518
00:20:45,120 --> 00:20:46,720
when we go ahead and use the double
519
00:20:46,720 --> 00:20:48,960
score init method this doesn't mean that
520
00:20:48,960 --> 00:20:50,960
we cannot differentiate between
521
00:20:50,960 --> 00:20:53,679
mandatory parameters to non-mandatory
522
00:20:53,679 --> 00:20:56,640
parameters so say that you currently
523
00:20:56,640 --> 00:20:58,799
don't know how much you have from a
524
00:20:58,799 --> 00:21:01,840
specific item then you can go ahead and
525
00:21:01,840 --> 00:21:04,320
by default receive this quantity
526
00:21:04,320 --> 00:21:06,320
parameter as zero because it is
527
00:21:06,320 --> 00:21:08,080
realistic situation that you currently
528
00:21:08,080 --> 00:21:09,919
don't know how much phones you have on
529
00:21:09,919 --> 00:21:12,240
your store so you can directly go ahead
530
00:21:12,240 --> 00:21:14,640
and use a default value for that for
531
00:21:14,640 --> 00:21:15,600
example
532
00:21:15,600 --> 00:21:18,159
zero and then this will mean that you
533
00:21:18,159 --> 00:21:21,039
will not have to pass in those five and
534
00:21:21,039 --> 00:21:23,520
three here and now in order to show you
535
00:21:23,520 --> 00:21:26,080
the results of that if i was to run our
536
00:21:26,080 --> 00:21:27,840
program then you can see that we
537
00:21:27,840 --> 00:21:31,440
received zero twice for those two prints
538
00:21:31,440 --> 00:21:33,440
in here so that is something that you
539
00:21:33,440 --> 00:21:35,760
want to remember and one more quite
540
00:21:35,760 --> 00:21:37,840
important point that i'd like to talk
541
00:21:37,840 --> 00:21:40,000
about now is the fact that you can
542
00:21:40,000 --> 00:21:43,280
assign attributes to specific instances
543
00:21:43,280 --> 00:21:45,919
individually so say that you want to
544
00:21:45,919 --> 00:21:49,440
know if the laptop has numpad or not
545
00:21:49,440 --> 00:21:52,320
because some laptops are not having the
546
00:21:52,320 --> 00:21:54,880
numpad on the right side of the keyboard
547
00:21:54,880 --> 00:21:57,760
but this is not a realistic attribute
548
00:21:57,760 --> 00:22:00,559
that you would want to assign to a phone
549
00:22:00,559 --> 00:22:03,440
and that is why you can go ahead and let
550
00:22:03,440 --> 00:22:05,919
me delete those print lines by the way
551
00:22:05,919 --> 00:22:07,840
and that is why you can go ahead and say
552
00:22:07,840 --> 00:22:11,120
something like item two dot has
553
00:22:11,120 --> 00:22:14,320
numpad equals to false like that and
554
00:22:14,320 --> 00:22:15,760
that is something that you want to
555
00:22:15,760 --> 00:22:18,480
remember because the fact that you use
556
00:22:18,480 --> 00:22:20,480
some attribute assignments in the
557
00:22:20,480 --> 00:22:23,039
constructor doesn't mean that you cannot
558
00:22:23,039 --> 00:22:24,960
add some more attributes that you would
559
00:22:24,960 --> 00:22:28,159
like after you instantiate the instances
560
00:22:28,159 --> 00:22:30,400
that you would like to alright so now
561
00:22:30,400 --> 00:22:32,400
that we understood this then there is
562
00:22:32,400 --> 00:22:34,480
still one small problem that is left
563
00:22:34,480 --> 00:22:37,039
that we need to solve now pay attention
564
00:22:37,039 --> 00:22:40,000
how the calculate total price still
565
00:22:40,000 --> 00:22:43,200
receives the x and y as parameters and
566
00:22:43,200 --> 00:22:45,760
the question that we ask now is
567
00:22:45,760 --> 00:22:48,159
why it still receives those parameters
568
00:22:48,159 --> 00:22:50,960
well we could for sure now not receive
569
00:22:50,960 --> 00:22:53,679
those parameters because as we know for
570
00:22:53,679 --> 00:22:56,240
each method that we design in classes
571
00:22:56,240 --> 00:22:58,720
then the object itself is passed in
572
00:22:58,720 --> 00:23:00,559
argument and i know that i repeated this
573
00:23:00,559 --> 00:23:02,960
couple of times but this is where i fail
574
00:23:02,960 --> 00:23:05,360
to understand classes so that is why it
575
00:23:05,360 --> 00:23:07,520
is very important to understand this
576
00:23:07,520 --> 00:23:09,760
behavior and we already know that the
577
00:23:09,760 --> 00:23:12,080
object itself passed as an argument so
578
00:23:12,080 --> 00:23:15,280
that's why we receive self and so this
579
00:23:15,280 --> 00:23:19,200
means that now we could just return
580
00:23:19,200 --> 00:23:23,200
self.price multiplied by self.quantity
581
00:23:23,200 --> 00:23:25,039
and this will mean that we don't really
582
00:23:25,039 --> 00:23:27,440
have to receive those parameters because
583
00:23:27,440 --> 00:23:29,679
we assign those attributes
584
00:23:29,679 --> 00:23:32,320
once the instances has been created so
585
00:23:32,320 --> 00:23:34,640
this means that we have access to those
586
00:23:34,640 --> 00:23:36,559
attributes throughout the methods that
587
00:23:36,559 --> 00:23:38,400
we are going to add here in this class
588
00:23:38,400 --> 00:23:40,720
in the future so in order to test that
589
00:23:40,720 --> 00:23:43,039
this works then i'm going to
590
00:23:43,039 --> 00:23:45,440
delete this example for now and i'm
591
00:23:45,440 --> 00:23:48,080
going to say print item 1
592
00:23:48,080 --> 00:23:48,960
dot
593
00:23:48,960 --> 00:23:51,840
calculate total price so we will be able
594
00:23:51,840 --> 00:23:54,880
to return the result here and i will do
595
00:23:54,880 --> 00:23:56,400
the same for
596
00:23:56,400 --> 00:23:57,440
item
597
00:23:57,440 --> 00:24:00,799
two um sorry only this one now to show
598
00:24:00,799 --> 00:24:03,760
some real number other than zero then i
599
00:24:03,760 --> 00:24:06,320
will go ahead and pass in here
600
00:24:06,320 --> 00:24:09,039
quantities so i will say one and
601
00:24:09,039 --> 00:24:10,880
three for example because i don't want
602
00:24:10,880 --> 00:24:13,360
to multiply a large number with a zero
603
00:24:13,360 --> 00:24:16,400
and that could come from here so i will
604
00:24:16,400 --> 00:24:18,720
run that and you see that we receive the
605
00:24:18,720 --> 00:24:21,760
expected results so now we completely
606
00:24:21,760 --> 00:24:24,640
understand the big picture how to work
607
00:24:24,640 --> 00:24:27,120
with the constructors in classes and
608
00:24:27,120 --> 00:24:28,960
what are the best practices that you
609
00:24:28,960 --> 00:24:31,279
should go ahead and implement all right
610
00:24:31,279 --> 00:24:33,760
so now that we understood this then we
611
00:24:33,760 --> 00:24:35,440
might think that we have done everything
612
00:24:35,440 --> 00:24:37,760
perfectly but actually i want to show
613
00:24:37,760 --> 00:24:40,320
you what will happen if we were to pass
614
00:24:40,320 --> 00:24:43,279
in here a string besides
615
00:24:43,279 --> 00:24:46,640
an integer and run our program so if we
616
00:24:46,640 --> 00:24:48,640
were to run that then you can see that
617
00:24:48,640 --> 00:24:51,120
we are screwing things up here because
618
00:24:51,120 --> 00:24:53,600
this function for example thinks that it
619
00:24:53,600 --> 00:24:56,480
should print the string
620
00:24:56,480 --> 00:24:58,480
three times because you'll see we have
621
00:24:58,480 --> 00:25:01,600
1000 multiplied by three that is being
622
00:25:01,600 --> 00:25:03,760
returned in here so it shows us one
623
00:25:03,760 --> 00:25:05,120
thousand once
624
00:25:05,120 --> 00:25:06,400
one thousand
625
00:25:06,400 --> 00:25:09,039
twice and then one more time so what
626
00:25:09,039 --> 00:25:11,200
that means it means that we have to
627
00:25:11,200 --> 00:25:13,679
validate the data types of the values
628
00:25:13,679 --> 00:25:16,080
that we are passing in so there are a
629
00:25:16,080 --> 00:25:18,640
couple of ways to achieve this and one
630
00:25:18,640 --> 00:25:20,799
way is by using typings in the
631
00:25:20,799 --> 00:25:23,200
parameters that you're declaring inside
632
00:25:23,200 --> 00:25:26,240
here so a great starter will be for
633
00:25:26,240 --> 00:25:28,880
example to declare that a name must be a
634
00:25:28,880 --> 00:25:32,320
string now let me first take this back
635
00:25:32,320 --> 00:25:35,039
and change those to integer and then go
636
00:25:35,039 --> 00:25:38,320
here and design those parameters so in
637
00:25:38,320 --> 00:25:40,559
order to specify a typing then you
638
00:25:40,559 --> 00:25:42,799
should go ahead and create a column sign
639
00:25:42,799 --> 00:25:45,039
followed by the type of the data type
640
00:25:45,039 --> 00:25:47,760
that you expect to receive here so if i
641
00:25:47,760 --> 00:25:50,159
was to pass in here only the object
642
00:25:50,159 --> 00:25:53,600
reference to the class of str then it
643
00:25:53,600 --> 00:25:56,080
will mean that it will have to accept
644
00:25:56,080 --> 00:25:58,960
strings only and i can preview that by
645
00:25:58,960 --> 00:26:01,200
changing this to an integer and you're
646
00:26:01,200 --> 00:26:03,440
gonna see that we have a complaint here
647
00:26:03,440 --> 00:26:07,039
that says expected type str got int
648
00:26:07,039 --> 00:26:10,320
instead and that is perfect so now that
649
00:26:10,320 --> 00:26:12,240
we have done this then i'm going to do
650
00:26:12,240 --> 00:26:15,760
the same for the price itself and price
651
00:26:15,760 --> 00:26:17,200
we could actually
652
00:26:17,200 --> 00:26:19,279
do the same thing with it
653
00:26:19,279 --> 00:26:22,960
by passing in float now when we pass
654
00:26:22,960 --> 00:26:26,559
float it is okay to also pass integers
655
00:26:26,559 --> 00:26:28,240
and that is something very unique with
656
00:26:28,240 --> 00:26:30,400
floats and integers together so that is
657
00:26:30,400 --> 00:26:33,760
okay to use the typing of float and for
658
00:26:33,760 --> 00:26:36,480
the quantity we don't need to specify a
659
00:26:36,480 --> 00:26:39,279
typing because the fact that we passed a
660
00:26:39,279 --> 00:26:42,159
default value of integer already marked
661
00:26:42,159 --> 00:26:45,360
this parameter as to be integer always
662
00:26:45,360 --> 00:26:48,640
so that is why for example if i was to
663
00:26:48,640 --> 00:26:50,640
leave this as it is and change the
664
00:26:50,640 --> 00:26:53,279
quantity to a string then you're gonna
665
00:26:53,279 --> 00:26:55,440
see that it is going to complain because
666
00:26:55,440 --> 00:26:58,080
the default value is already an integer
667
00:26:58,080 --> 00:27:01,279
so it expects for an integer all right
668
00:27:01,279 --> 00:27:03,120
so those things are actually great
669
00:27:03,120 --> 00:27:06,000
setups to make our init function more
670
00:27:06,000 --> 00:27:08,400
powerful but we might still want to
671
00:27:08,400 --> 00:27:10,720
validate the received values in the
672
00:27:10,720 --> 00:27:13,679
following way so say that you never want
673
00:27:13,679 --> 00:27:16,240
to receive a negative number of quantity
674
00:27:16,240 --> 00:27:18,480
and you never want to receive a negative
675
00:27:18,480 --> 00:27:20,880
number of price so that is something
676
00:27:20,880 --> 00:27:23,200
that you cannot achieve by the typings
677
00:27:23,200 --> 00:27:25,279
in here but there's actually a great way
678
00:27:25,279 --> 00:27:27,840
to work this around and that will be by
679
00:27:27,840 --> 00:27:32,000
using assert statements now a third is a
680
00:27:32,000 --> 00:27:36,000
statement keyword that is used to check
681
00:27:36,000 --> 00:27:38,960
if there is a match between what is
682
00:27:38,960 --> 00:27:41,679
happening to your expectations so let's
683
00:27:41,679 --> 00:27:43,840
see how we can get work with assert so
684
00:27:43,840 --> 00:27:45,520
i'm actually going to delete this from
685
00:27:45,520 --> 00:27:48,880
here and i'm going to organize our init
686
00:27:48,880 --> 00:27:50,880
method a little bit i'm going to say
687
00:27:50,880 --> 00:27:54,480
here a comment and i will say assign to
688
00:27:54,480 --> 00:27:55,840
self object
689
00:27:55,840 --> 00:27:59,039
and i will say up top something like
690
00:27:59,039 --> 00:28:02,159
run validations to the received
691
00:28:02,159 --> 00:28:03,440
arguments
692
00:28:03,440 --> 00:28:06,880
all right so now it is a great idea to
693
00:28:06,880 --> 00:28:09,840
validate that the price and quantity are
694
00:28:09,840 --> 00:28:12,559
both greater than or equal to zero
695
00:28:12,559 --> 00:28:14,720
because we probably don't want to handle
696
00:28:14,720 --> 00:28:16,799
with those when they are negative
697
00:28:16,799 --> 00:28:19,120
numbers and we want to crash the program
698
00:28:19,120 --> 00:28:21,919
so we could say assert and pay attention
699
00:28:21,919 --> 00:28:24,159
that i use it as a statement not a
700
00:28:24,159 --> 00:28:26,480
built-in function or something like that
701
00:28:26,480 --> 00:28:28,840
and i can say here
702
00:28:28,840 --> 00:28:30,799
price is
703
00:28:30,799 --> 00:28:33,200
greater than or equal to
704
00:28:33,200 --> 00:28:36,799
zero now once i set this then i can also
705
00:28:36,799 --> 00:28:38,320
do the same for
706
00:28:38,320 --> 00:28:41,440
quantity actually so let me do that
707
00:28:41,440 --> 00:28:43,279
quickly
708
00:28:43,279 --> 00:28:44,399
by
709
00:28:44,399 --> 00:28:47,440
this way and then once we have this then
710
00:28:47,440 --> 00:28:48,799
i can actually
711
00:28:48,799 --> 00:28:51,279
go ahead and run our program and you
712
00:28:51,279 --> 00:28:53,039
will see that i will not receive any
713
00:28:53,039 --> 00:28:56,240
arrows but the second that i change this
714
00:28:56,240 --> 00:28:59,440
quantity to negative 1 for example and
715
00:28:59,440 --> 00:29:02,000
this one being negative 3 then i will
716
00:29:02,000 --> 00:29:05,120
have some errors that will say assertion
717
00:29:05,120 --> 00:29:08,640
error now you can see that the fact that
718
00:29:08,640 --> 00:29:10,799
we see here assertion error
719
00:29:10,799 --> 00:29:13,200
is quite a general exception that
720
00:29:13,200 --> 00:29:15,360
doesn't mean anything now what is so
721
00:29:15,360 --> 00:29:17,760
beautiful with assert you can add your
722
00:29:17,760 --> 00:29:20,720
own exception messages right near of it
723
00:29:20,720 --> 00:29:23,120
as a second argument so
724
00:29:23,120 --> 00:29:25,600
let's go up top here and go back to
725
00:29:25,600 --> 00:29:28,240
those two lines so the first argument
726
00:29:28,240 --> 00:29:30,720
that is passed to the statement is the
727
00:29:30,720 --> 00:29:32,960
statement that would like to check but
728
00:29:32,960 --> 00:29:36,000
if we were to say here comma and use a
729
00:29:36,000 --> 00:29:37,760
string to say
730
00:29:37,760 --> 00:29:39,919
actually a formatted string and i can
731
00:29:39,919 --> 00:29:41,520
say
732
00:29:41,520 --> 00:29:42,880
price
733
00:29:42,880 --> 00:29:45,760
and then refer to the value of it
734
00:29:45,760 --> 00:29:49,200
is not greater than
735
00:29:49,679 --> 00:29:51,679
0 like that
736
00:29:51,679 --> 00:29:54,080
i can add an explanation mark here and i
737
00:29:54,080 --> 00:29:56,240
can use the same thing
738
00:29:56,240 --> 00:29:58,799
copy that with a comma and paste this in
739
00:29:58,799 --> 00:30:03,200
here and change this quantity
740
00:30:03,279 --> 00:30:06,080
and then refer to the value of it
741
00:30:06,080 --> 00:30:08,640
and say that it is not equal to i mean
742
00:30:08,640 --> 00:30:11,039
greater than or equal to zero so it
743
00:30:11,039 --> 00:30:12,720
needs to be actually changed to greater
744
00:30:12,720 --> 00:30:15,279
than or equal to
745
00:30:15,279 --> 00:30:16,720
like that
746
00:30:16,720 --> 00:30:19,120
and same goes for
747
00:30:19,120 --> 00:30:20,000
here
748
00:30:20,000 --> 00:30:21,600
and i have some
749
00:30:21,600 --> 00:30:23,679
space here that should be deleted all
750
00:30:23,679 --> 00:30:26,320
right so now if i was to execute our
751
00:30:26,320 --> 00:30:28,559
program then you can see that we receive
752
00:30:28,559 --> 00:30:31,200
assertion error quantity
753
00:30:31,200 --> 00:30:34,159
minus one is not greater or equal than
754
00:30:34,159 --> 00:30:36,559
zero so i should delete this
755
00:30:36,559 --> 00:30:39,360
then here for that and now it is perfect
756
00:30:39,360 --> 00:30:41,200
so now we understand that using the
757
00:30:41,200 --> 00:30:43,360
assert statement could allow us to
758
00:30:43,360 --> 00:30:46,159
validate the arguments that we receive
759
00:30:46,159 --> 00:30:48,480
and also it allows us to catch up the
760
00:30:48,480 --> 00:30:50,480
bugs as soon as possible
761
00:30:50,480 --> 00:30:52,559
before going forward with the rest of
762
00:30:52,559 --> 00:30:55,120
the actions that we like to take within
763
00:30:55,120 --> 00:30:57,200
this program so let me actually change
764
00:30:57,200 --> 00:31:00,880
those back to valid values like that
765
00:31:00,880 --> 00:31:03,519
and that is perfect alright so until
766
00:31:03,519 --> 00:31:05,519
this point we learned about how to work
767
00:31:05,519 --> 00:31:07,679
with the constructor and we also learned
768
00:31:07,679 --> 00:31:09,760
about how to assign different attributes
769
00:31:09,760 --> 00:31:12,080
to instances that are going to be unique
770
00:31:12,080 --> 00:31:14,480
per instance which means that you can go
771
00:31:14,480 --> 00:31:16,320
ahead and create as much as instances as
772
00:31:16,320 --> 00:31:18,159
you want and you have the control to
773
00:31:18,159 --> 00:31:20,320
pass whatever values you'd like to for
774
00:31:20,320 --> 00:31:23,120
the name price and quantity now consider
775
00:31:23,120 --> 00:31:25,279
a situation that you'll want to make use
776
00:31:25,279 --> 00:31:27,600
of an attribute that is going to be
777
00:31:27,600 --> 00:31:31,279
global or across all the instances now a
778
00:31:31,279 --> 00:31:33,360
good candidate for example of this could
779
00:31:33,360 --> 00:31:35,679
be a situation that you'll want to apply
780
00:31:35,679 --> 00:31:38,159
a sale on your shop so this means that
781
00:31:38,159 --> 00:31:40,240
you want to go ahead and having the
782
00:31:40,240 --> 00:31:42,720
control of applying some discount for
783
00:31:42,720 --> 00:31:45,679
each one of the items and that is a good
784
00:31:45,679 --> 00:31:48,159
candidate for creating an attribute that
785
00:31:48,159 --> 00:31:50,480
is going to be shared across all the
786
00:31:50,480 --> 00:31:54,000
instances now we call those kind of
787
00:31:54,000 --> 00:31:56,720
attributes class attributes and the kind
788
00:31:56,720 --> 00:31:58,480
of attribute that we have learned till
789
00:31:58,480 --> 00:32:00,720
this point is actually called in a full
790
00:32:00,720 --> 00:32:03,440
name instance attributes so about
791
00:32:03,440 --> 00:32:05,200
instance attributes we know everything
792
00:32:05,200 --> 00:32:07,039
and we learned how to work with it but
793
00:32:07,039 --> 00:32:09,120
we did not work it with the other kind
794
00:32:09,120 --> 00:32:11,039
of the attributes which we will do in
795
00:32:11,039 --> 00:32:13,360
this tutorial which is called again a
796
00:32:13,360 --> 00:32:16,240
class attribute so a class attribute is
797
00:32:16,240 --> 00:32:18,080
an attribute that is going to be belong
798
00:32:18,080 --> 00:32:21,200
to the class itself but however you can
799
00:32:21,200 --> 00:32:23,679
also access this attribute from the
800
00:32:23,679 --> 00:32:26,000
instance level as well let's go ahead
801
00:32:26,000 --> 00:32:28,159
and see a good candidate for a class
802
00:32:28,159 --> 00:32:29,840
attribute that you want to go ahead and
803
00:32:29,840 --> 00:32:32,480
create it so that's gonna be going to
804
00:32:32,480 --> 00:32:35,519
our class here and just in the first
805
00:32:35,519 --> 00:32:37,519
line inside our class i can go ahead and
806
00:32:37,519 --> 00:32:39,600
create a class attribute so let's go
807
00:32:39,600 --> 00:32:41,440
ahead and create an attribute like pay
808
00:32:41,440 --> 00:32:44,559
rate equals to 0.8 and the reason that
809
00:32:44,559 --> 00:32:46,399
i'm doing this is because i said that
810
00:32:46,399 --> 00:32:48,000
there is going to be 20 percent of
811
00:32:48,000 --> 00:32:50,880
discount so i probably want to store an
812
00:32:50,880 --> 00:32:52,960
attribute that will describe how much i
813
00:32:52,960 --> 00:32:54,559
still need to pay
814
00:32:54,559 --> 00:32:58,480
so i will say here the pay rate after
815
00:32:58,480 --> 00:33:02,480
20 percent discount like that okay so
816
00:33:02,480 --> 00:33:04,799
now that we have created this then let's
817
00:33:04,799 --> 00:33:07,120
see what are the ways that we can access
818
00:33:07,120 --> 00:33:09,840
this attribute now if i was to go down
819
00:33:09,840 --> 00:33:12,640
and actually deleting one of those and
820
00:33:12,640 --> 00:33:14,640
say something inside this print line
821
00:33:14,640 --> 00:33:16,240
that will look like the following so i
822
00:33:16,240 --> 00:33:18,159
will try to access to the reference of
823
00:33:18,159 --> 00:33:19,919
the class itself so i'm not going to
824
00:33:19,919 --> 00:33:22,399
create an instance like that besides i'm
825
00:33:22,399 --> 00:33:24,240
just going to bring in the reference to
826
00:33:24,240 --> 00:33:26,640
the class level itself and i'm going to
827
00:33:26,640 --> 00:33:28,880
try to access this attribute by saying
828
00:33:28,880 --> 00:33:31,760
pay underscore rate now if i was to run
829
00:33:31,760 --> 00:33:33,440
that then you're going to see that as
830
00:33:33,440 --> 00:33:35,840
expected we see this class attribute
831
00:33:35,840 --> 00:33:37,679
because that is a way that you can
832
00:33:37,679 --> 00:33:40,240
access those class attributes now this
833
00:33:40,240 --> 00:33:42,480
might be confusing but i said a minute
834
00:33:42,480 --> 00:33:45,039
ago that you can also access those class
835
00:33:45,039 --> 00:33:47,760
attributes from the instance level well
836
00:33:47,760 --> 00:33:49,919
let's see if that is true so if i was to
837
00:33:49,919 --> 00:33:53,200
duplicate those lines twice by using the
838
00:33:53,200 --> 00:33:55,519
shortcut of control d
839
00:33:55,519 --> 00:33:57,519
then let's go ahead and change those to
840
00:33:57,519 --> 00:33:59,200
item one
841
00:33:59,200 --> 00:34:03,440
and this one to item two now see how i
842
00:34:03,440 --> 00:34:06,080
try to access the pay rate attribute
843
00:34:06,080 --> 00:34:08,320
from the instance although we don't have
844
00:34:08,320 --> 00:34:10,879
such an instance attribute now if i was
845
00:34:10,879 --> 00:34:12,719
to run that then you're gonna see that
846
00:34:12,719 --> 00:34:15,918
we still have the access to see that
847
00:34:15,918 --> 00:34:18,079
class attribute well that might be
848
00:34:18,079 --> 00:34:20,159
confusing and that might be hard to
849
00:34:20,159 --> 00:34:22,399
understand why that is happening well
850
00:34:22,399 --> 00:34:23,918
there is actually something that we need
851
00:34:23,918 --> 00:34:25,679
to understand when we work with
852
00:34:25,679 --> 00:34:28,000
instances in python so when we have an
853
00:34:28,000 --> 00:34:30,800
instance on our hand then at first this
854
00:34:30,800 --> 00:34:33,599
instance tries to bring the attribute
855
00:34:33,599 --> 00:34:34,800
from the
856
00:34:34,800 --> 00:34:37,839
instance level at first stage but if it
857
00:34:37,839 --> 00:34:40,159
doesn't find it there then it is going
858
00:34:40,159 --> 00:34:42,560
to try to bring that attribute from the
859
00:34:42,560 --> 00:34:45,119
class level so what that means it means
860
00:34:45,119 --> 00:34:48,079
that item one did some thinking here and
861
00:34:48,079 --> 00:34:50,320
say to itself okay so i don't have this
862
00:34:50,320 --> 00:34:52,719
attribute right in here because that is
863
00:34:52,719 --> 00:34:54,639
just not an attribute that assigned to
864
00:34:54,639 --> 00:34:56,639
me so i'm going to try to search that
865
00:34:56,639 --> 00:34:58,640
from the instance level and then i'm
866
00:34:58,640 --> 00:35:01,040
going to find it and print it back so
867
00:35:01,040 --> 00:35:03,200
that is exactly what is happening here
868
00:35:03,200 --> 00:35:06,400
item 1 and item 2 are instances that
869
00:35:06,400 --> 00:35:09,280
could not find the pay rate attribute on
870
00:35:09,280 --> 00:35:12,079
the instance level so both of them went
871
00:35:12,079 --> 00:35:14,640
ahead and tried to bring this attribute
872
00:35:14,640 --> 00:35:17,119
from the class level and since it really
873
00:35:17,119 --> 00:35:18,880
exists in the class level then we were
874
00:35:18,880 --> 00:35:20,880
able to access those now to even give
875
00:35:20,880 --> 00:35:23,040
you a better idea of what is going on
876
00:35:23,040 --> 00:35:24,960
here then i'm going to do one more
877
00:35:24,960 --> 00:35:27,119
additional thing now i will delete this
878
00:35:27,119 --> 00:35:29,599
first print line and i will go ahead and
879
00:35:29,599 --> 00:35:31,760
delete those attributes from here as
880
00:35:31,760 --> 00:35:35,040
well now there is a built-in magic
881
00:35:35,040 --> 00:35:37,599
attribute not a magic method that you
882
00:35:37,599 --> 00:35:39,599
can go ahead and see all the attributes
883
00:35:39,599 --> 00:35:41,920
that are belonging to that specific
884
00:35:41,920 --> 00:35:45,280
object and that is achievable by using
885
00:35:45,280 --> 00:35:49,040
this double underscore dict double
886
00:35:49,040 --> 00:35:52,160
underscore like that so this will go
887
00:35:52,160 --> 00:35:53,839
ahead and try to bring you all the
888
00:35:53,839 --> 00:35:56,000
attributes that are belonging to the
889
00:35:56,000 --> 00:35:57,920
object that you apply this attribute and
890
00:35:57,920 --> 00:36:00,160
want to see its content so i will go
891
00:36:00,160 --> 00:36:01,280
ahead and
892
00:36:01,280 --> 00:36:03,280
copy this one and paste this in for the
893
00:36:03,280 --> 00:36:05,760
instance level as well so this should
894
00:36:05,760 --> 00:36:08,800
give me all the attributes for class
895
00:36:08,800 --> 00:36:09,760
level
896
00:36:09,760 --> 00:36:11,760
and the second line
897
00:36:11,760 --> 00:36:14,079
should do this for the
898
00:36:14,079 --> 00:36:16,320
instance level all right and if i was to
899
00:36:16,320 --> 00:36:19,040
run that then let's explore the results
900
00:36:19,040 --> 00:36:21,520
for a second now you can see that at the
901
00:36:21,520 --> 00:36:24,160
first line we see this pay rate
902
00:36:24,160 --> 00:36:26,560
attribute but in the second line we
903
00:36:26,560 --> 00:36:28,720
never see it we see name price and
904
00:36:28,720 --> 00:36:31,200
quantity and you can also pay attention
905
00:36:31,200 --> 00:36:33,119
that this magic attribute is actually
906
00:36:33,119 --> 00:36:35,359
responsible to take all the attributes
907
00:36:35,359 --> 00:36:37,680
and convert this to a dictionary and
908
00:36:37,680 --> 00:36:39,520
that is from where the
909
00:36:39,520 --> 00:36:41,119
keyword coming from it is just a
910
00:36:41,119 --> 00:36:43,680
shortened version of a dictionary so
911
00:36:43,680 --> 00:36:45,680
that is a very useful magic attribute
912
00:36:45,680 --> 00:36:47,520
that you can go ahead and use if you
913
00:36:47,520 --> 00:36:49,359
just want to see temporarily for
914
00:36:49,359 --> 00:36:51,680
debugging reasons all the attributes
915
00:36:51,680 --> 00:36:54,079
that are belonging to some object all
916
00:36:54,079 --> 00:36:56,079
right so now that we understood this
917
00:36:56,079 --> 00:36:57,760
then let's take it to a real life
918
00:36:57,760 --> 00:36:59,599
example and come up with a method that
919
00:36:59,599 --> 00:37:02,000
will go ahead and apply a discount on
920
00:37:02,000 --> 00:37:04,640
our items price so that will be by
921
00:37:04,640 --> 00:37:06,880
creating a method that will be belong to
922
00:37:06,880 --> 00:37:09,040
each of our instances and that means
923
00:37:09,040 --> 00:37:10,880
that we can go ahead and come up with a
924
00:37:10,880 --> 00:37:13,839
method that we could name apply discount
925
00:37:13,839 --> 00:37:15,839
so let's go ahead and start working on
926
00:37:15,839 --> 00:37:18,400
this so i'm going to say def apply
927
00:37:18,400 --> 00:37:20,320
discount and pay attention that i'm
928
00:37:20,320 --> 00:37:23,040
using a new method inside a class here
929
00:37:23,040 --> 00:37:23,760
so
930
00:37:23,760 --> 00:37:26,800
right inside of this then at first we
931
00:37:26,800 --> 00:37:29,040
need to figure out how we are going to
932
00:37:29,040 --> 00:37:31,280
override an attribute that is belonging
933
00:37:31,280 --> 00:37:33,520
to an instance and we already know that
934
00:37:33,520 --> 00:37:35,680
we can do that with the self keyword so
935
00:37:35,680 --> 00:37:37,599
it will be self
936
00:37:37,599 --> 00:37:39,040
dot price
937
00:37:39,040 --> 00:37:41,599
and that will be equal to self.price
938
00:37:41,599 --> 00:37:43,920
meaning the older value of this
939
00:37:43,920 --> 00:37:45,280
attribute
940
00:37:45,280 --> 00:37:49,839
multiplied by the pay rate now you might
941
00:37:49,839 --> 00:37:51,520
expect that we could access this
942
00:37:51,520 --> 00:37:53,920
directly like that but if you remember
943
00:37:53,920 --> 00:37:56,000
that is actually belonging to the item
944
00:37:56,000 --> 00:37:58,480
class itself now this might be confusing
945
00:37:58,480 --> 00:38:01,040
because this method already inside this
946
00:38:01,040 --> 00:38:03,200
class so you might think already that
947
00:38:03,200 --> 00:38:05,359
you can access it directly by saying pay
948
00:38:05,359 --> 00:38:07,359
rate because it is already inside the
949
00:38:07,359 --> 00:38:09,359
class but that is actually not going to
950
00:38:09,359 --> 00:38:11,520
work because you can either access it
951
00:38:11,520 --> 00:38:13,520
from the class level or the instance
952
00:38:13,520 --> 00:38:15,599
level as we understood previously so i
953
00:38:15,599 --> 00:38:18,480
can go ahead and say item dot pay rate
954
00:38:18,480 --> 00:38:20,480
like that and there you have a method
955
00:38:20,480 --> 00:38:22,960
that can go ahead and basically override
956
00:38:22,960 --> 00:38:25,520
the price attribute for one of your
957
00:38:25,520 --> 00:38:28,720
items now to show you that this works
958
00:38:28,720 --> 00:38:31,920
then i can only use one instance for now
959
00:38:31,920 --> 00:38:34,480
and i can go ahead and call this method
960
00:38:34,480 --> 00:38:38,640
by say apply discount and i can also
961
00:38:38,640 --> 00:38:41,680
now try to print the attribute of price
962
00:38:41,680 --> 00:38:43,280
for this item
963
00:38:43,280 --> 00:38:46,480
one and we should see 80 right so if we
964
00:38:46,480 --> 00:38:48,560
were to run that then we're going to see
965
00:38:48,560 --> 00:38:51,040
that we are going to receive 80.0 as
966
00:38:51,040 --> 00:38:53,280
expected now we should not forget the
967
00:38:53,280 --> 00:38:55,200
option that you might also want to have
968
00:38:55,200 --> 00:38:57,599
a different discount amount for a
969
00:38:57,599 --> 00:39:00,240
specific item so say that one day you'll
970
00:39:00,240 --> 00:39:03,520
have 20 items and only for the laptop
971
00:39:03,520 --> 00:39:06,640
you want to have a 30 discount but it is
972
00:39:06,640 --> 00:39:08,960
going to be a bad idea changing the
973
00:39:08,960 --> 00:39:12,000
class attribute to 0.7 because it will
974
00:39:12,000 --> 00:39:14,079
affect all the items that you have right
975
00:39:14,079 --> 00:39:16,079
now on your hand so what you can do
976
00:39:16,079 --> 00:39:18,800
instead is you can assign this attribute
977
00:39:18,800 --> 00:39:21,280
directly to one of the instances that
978
00:39:21,280 --> 00:39:22,720
you would like to have a different
979
00:39:22,720 --> 00:39:25,119
discount amount for so let's go ahead
980
00:39:25,119 --> 00:39:27,040
and see an example for this so i will
981
00:39:27,040 --> 00:39:29,440
allow myself to bring back the item of
982
00:39:29,440 --> 00:39:33,200
laptop and then what i can do to apply a
983
00:39:33,200 --> 00:39:36,880
30 discount for this item is assigning
984
00:39:36,880 --> 00:39:39,680
the exact same attribute to the instance
985
00:39:39,680 --> 00:39:41,839
so i can go ahead and use a item tool
986
00:39:41,839 --> 00:39:43,839
dot pay on the score rate
987
00:39:43,839 --> 00:39:45,320
is equal to
988
00:39:45,320 --> 00:39:48,880
0.7 now what will happen here is that
989
00:39:48,880 --> 00:39:51,920
for item 2 it will find the attribute of
990
00:39:51,920 --> 00:39:54,640
pay rate in the instance level so item 2
991
00:39:54,640 --> 00:39:56,240
does not really have to go ahead to the
992
00:39:56,240 --> 00:39:58,800
class level and bring back the value of
993
00:39:58,800 --> 00:40:01,119
pay rate because at first look it is
994
00:40:01,119 --> 00:40:03,520
going to find it in the instance level
995
00:40:03,520 --> 00:40:05,520
but for item 1 it is different it is
996
00:40:05,520 --> 00:40:08,079
still going to read from the item level
997
00:40:08,079 --> 00:40:10,480
which is going to be 0.8
998
00:40:10,480 --> 00:40:14,480
so now if we were to try to use item two
999
00:40:14,480 --> 00:40:17,680
dot apply discount and as well as
1000
00:40:17,680 --> 00:40:21,520
printing the price now then let's see
1001
00:40:21,520 --> 00:40:24,640
what will happen so i will uncomment
1002
00:40:24,640 --> 00:40:27,680
this line to not see this print for now
1003
00:40:27,680 --> 00:40:29,359
and i will go ahead and execute our
1004
00:40:29,359 --> 00:40:32,960
program now you can see that we still
1005
00:40:32,960 --> 00:40:35,760
however receive 800
1006
00:40:35,760 --> 00:40:38,000
and what this means this means that the
1007
00:40:38,000 --> 00:40:40,400
discount that has been applied is still
1008
00:40:40,400 --> 00:40:41,839
20
1009
00:40:41,839 --> 00:40:44,319
and where this is coming from well this
1010
00:40:44,319 --> 00:40:47,680
is coming from this method here that no
1011
00:40:47,680 --> 00:40:50,400
matter what we try to pull the pay rate
1012
00:40:50,400 --> 00:40:52,960
from the class level so a best practice
1013
00:40:52,960 --> 00:40:56,720
here will be to change this to self and
1014
00:40:56,720 --> 00:40:59,440
that way if we overwrite the pay rate
1015
00:40:59,440 --> 00:41:01,680
for the instance level then it is going
1016
00:41:01,680 --> 00:41:04,640
to read from the instance level but for
1017
00:41:04,640 --> 00:41:08,160
item one if we try to access the pay
1018
00:41:08,160 --> 00:41:10,960
rate from the instance level then this
1019
00:41:10,960 --> 00:41:13,599
is still great because we did not assign
1020
00:41:13,599 --> 00:41:16,079
a specific pay rate for item one so it
1021
00:41:16,079 --> 00:41:17,680
is going to pull that from the class
1022
00:41:17,680 --> 00:41:20,880
level now if we were to try to run that
1023
00:41:20,880 --> 00:41:22,560
then you're gonna see now that we have
1024
00:41:22,560 --> 00:41:25,599
expected results and if we were to also
1025
00:41:25,599 --> 00:41:28,079
uncomment the first print line for the
1026
00:41:28,079 --> 00:41:31,440
item one and rerun our program then you
1027
00:41:31,440 --> 00:41:34,160
can see that for item one we had twenty
1028
00:41:34,160 --> 00:41:37,040
percent discount and for item two we had
1029
00:41:37,040 --> 00:41:39,200
thirty percent discount so when it comes
1030
00:41:39,200 --> 00:41:41,920
to accessing class attributes you might
1031
00:41:41,920 --> 00:41:44,319
want to reconsider how you want to
1032
00:41:44,319 --> 00:41:46,079
access them when you come up with some
1033
00:41:46,079 --> 00:41:48,800
methods and specifically for creating a
1034
00:41:48,800 --> 00:41:51,359
method like apply discount it is a great
1035
00:41:51,359 --> 00:41:53,200
idea to access it from the instance
1036
00:41:53,200 --> 00:41:55,760
level so you also allow the option of
1037
00:41:55,760 --> 00:41:58,800
using a pay rate that is assigned to the
1038
00:41:58,800 --> 00:42:00,880
instance level okay so now that we
1039
00:42:00,880 --> 00:42:02,400
understood completely about the
1040
00:42:02,400 --> 00:42:04,079
differences between a class two and
1041
00:42:04,079 --> 00:42:06,079
instance attribute let's jump ahead to
1042
00:42:06,079 --> 00:42:08,480
the next topic now you see that i have
1043
00:42:08,480 --> 00:42:10,400
deleted those print lines that i have
1044
00:42:10,400 --> 00:42:12,640
down below and i came up with five
1045
00:42:12,640 --> 00:42:14,880
instances that i have created here so
1046
00:42:14,880 --> 00:42:16,880
you might also want to create those five
1047
00:42:16,880 --> 00:42:19,520
instances immediately so that is why i
1048
00:42:19,520 --> 00:42:21,440
will recommend you to go ahead to my
1049
00:42:21,440 --> 00:42:23,839
repository accessing this class
1050
00:42:23,839 --> 00:42:26,000
attributes directory and then code
1051
00:42:26,000 --> 00:42:27,920
snippets and then
1052
00:42:27,920 --> 00:42:30,400
go ahead and copy the code from these
1053
00:42:30,400 --> 00:42:33,359
five underscore items.py file okay so
1054
00:42:33,359 --> 00:42:35,520
considering a situation that your shop
1055
00:42:35,520 --> 00:42:37,359
is going to be larger in the future
1056
00:42:37,359 --> 00:42:39,040
meaning that you are going to have more
1057
00:42:39,040 --> 00:42:41,280
items then the more items that you are
1058
00:42:41,280 --> 00:42:43,680
going to have the more filtration like
1059
00:42:43,680 --> 00:42:46,079
things that you want to do in the future
1060
00:42:46,079 --> 00:42:47,920
but what is problematic currently with
1061
00:42:47,920 --> 00:42:50,240
our class is the fact that we don't have
1062
00:42:50,240 --> 00:42:52,480
any resource where we can just access
1063
00:42:52,480 --> 00:42:54,400
all the items that we have in our shop
1064
00:42:54,400 --> 00:42:56,960
right now now it could have been nicer
1065
00:42:56,960 --> 00:42:58,480
if we could somehow
1066
00:42:58,480 --> 00:43:01,200
have a list with all the item instances
1067
00:43:01,200 --> 00:43:03,520
that have been created until this point
1068
00:43:03,520 --> 00:43:05,920
but currently there is not an approach
1069
00:43:05,920 --> 00:43:08,480
that will give us a list with five
1070
00:43:08,480 --> 00:43:10,880
elements where each element will
1071
00:43:10,880 --> 00:43:13,760
represent an instance of a class so in
1072
00:43:13,760 --> 00:43:16,560
order to come up with such a design then
1073
00:43:16,560 --> 00:43:18,720
here is a wonderful candidate for
1074
00:43:18,720 --> 00:43:21,280
creating a class attribute that we could
1075
00:43:21,280 --> 00:43:24,560
name all and once we do this then we're
1076
00:43:24,560 --> 00:43:26,560
gonna see how we are going to add our
1077
00:43:26,560 --> 00:43:29,359
instances to that list so i will go
1078
00:43:29,359 --> 00:43:34,240
ahead and start by going here and use an
1079
00:43:34,240 --> 00:43:36,480
old attribute so it will be
1080
00:43:36,480 --> 00:43:37,760
all
1081
00:43:37,760 --> 00:43:41,200
equals to an empty list now we need to
1082
00:43:41,200 --> 00:43:44,240
figure out how we are going to add our
1083
00:43:44,240 --> 00:43:46,640
instances for each time that we are
1084
00:43:46,640 --> 00:43:48,880
going to go ahead and create an instance
1085
00:43:48,880 --> 00:43:51,119
now if you remember the double
1086
00:43:51,119 --> 00:43:54,160
underscore init method is being called
1087
00:43:54,160 --> 00:43:56,800
immediately once the instance has been
1088
00:43:56,800 --> 00:44:00,319
created so it might be a wonderful idea
1089
00:44:00,319 --> 00:44:02,400
going down below inside this double
1090
00:44:02,400 --> 00:44:05,520
underscore init method and use a code
1091
00:44:05,520 --> 00:44:07,760
that will be responsible to append to
1092
00:44:07,760 --> 00:44:10,160
that list every time that we create an
1093
00:44:10,160 --> 00:44:12,640
instance and that will be as easy as
1094
00:44:12,640 --> 00:44:15,040
saying something like the following so
1095
00:44:15,040 --> 00:44:16,880
first you could pay attention that i
1096
00:44:16,880 --> 00:44:18,880
actually wrote some commands in this
1097
00:44:18,880 --> 00:44:21,119
double underscore init function like run
1098
00:44:21,119 --> 00:44:24,160
validations and assign to self object so
1099
00:44:24,160 --> 00:44:25,839
it might be a great idea to start with a
1100
00:44:25,839 --> 00:44:29,040
comment here that will say actions
1101
00:44:29,040 --> 00:44:31,280
to execute just to really have a great
1102
00:44:31,280 --> 00:44:33,040
separation between the different things
1103
00:44:33,040 --> 00:44:35,440
that we are doing so now inside here i
1104
00:44:35,440 --> 00:44:36,960
can say item
1105
00:44:36,960 --> 00:44:39,680
dot all and you can see that i use the
1106
00:44:39,680 --> 00:44:42,560
class object first and then that is a
1107
00:44:42,560 --> 00:44:44,319
list so i can use
1108
00:44:44,319 --> 00:44:47,839
dot append and then i will just append
1109
00:44:47,839 --> 00:44:51,200
the self object now we know that self is
1110
00:44:51,200 --> 00:44:53,359
actually the instance itself every time
1111
00:44:53,359 --> 00:44:56,800
that it is being created so once we go
1112
00:44:56,800 --> 00:44:59,359
ahead and launch such a command inside
1113
00:44:59,359 --> 00:45:02,720
the init function then for each instance
1114
00:45:02,720 --> 00:45:05,359
that is going to be created this whole
1115
00:45:05,359 --> 00:45:07,599
list is going to be filled with our
1116
00:45:07,599 --> 00:45:10,240
instances now to show you that i can
1117
00:45:10,240 --> 00:45:12,960
jump a line after we create the
1118
00:45:12,960 --> 00:45:16,079
instances and we can say print
1119
00:45:16,079 --> 00:45:21,280
item dot all and now if i was to run our
1120
00:45:21,280 --> 00:45:23,119
program then you are going to see that
1121
00:45:23,119 --> 00:45:25,040
we are going to have a list with five
1122
00:45:25,040 --> 00:45:28,160
instances if i was to scroll right a bit
1123
00:45:28,160 --> 00:45:30,000
then you can see that i have exactly
1124
00:45:30,000 --> 00:45:33,200
five elements and that is perfect now
1125
00:45:33,200 --> 00:45:35,280
that's going to be extremely useful if
1126
00:45:35,280 --> 00:45:37,200
you want to do something with only one
1127
00:45:37,200 --> 00:45:39,920
of the attributes of your instances so
1128
00:45:39,920 --> 00:45:41,839
say that you would like to print all the
1129
00:45:41,839 --> 00:45:44,720
names for all of your instances then you
1130
00:45:44,720 --> 00:45:47,040
can use easily a for loop to achieve
1131
00:45:47,040 --> 00:45:49,599
such a task so we can go ahead and say
1132
00:45:49,599 --> 00:45:50,480
for
1133
00:45:50,480 --> 00:45:51,599
instance
1134
00:45:51,599 --> 00:45:52,480
in
1135
00:45:52,480 --> 00:45:56,079
item dot all and you can say print
1136
00:45:56,079 --> 00:45:59,200
instance dot name and once we come up
1137
00:45:59,200 --> 00:46:01,200
with this then you can see that we have
1138
00:46:01,200 --> 00:46:03,200
all the names for all the instances that
1139
00:46:03,200 --> 00:46:05,280
we have created so that is going to be
1140
00:46:05,280 --> 00:46:07,599
useful here and there especially if you
1141
00:46:07,599 --> 00:46:09,680
know how to use the filter function for
1142
00:46:09,680 --> 00:46:12,560
example to apply some special things on
1143
00:46:12,560 --> 00:46:14,480
some of the instances that are matching
1144
00:46:14,480 --> 00:46:16,960
your criteria all right so now that we
1145
00:46:16,960 --> 00:46:19,520
understood this then let's also take
1146
00:46:19,520 --> 00:46:21,520
care of one problem that we saw
1147
00:46:21,520 --> 00:46:24,880
previously now if i was to use a ctrl z
1148
00:46:24,880 --> 00:46:26,160
a couple of times
1149
00:46:26,160 --> 00:46:29,200
and still use this print item.all
1150
00:46:29,200 --> 00:46:32,480
now you could see that the way that the
1151
00:46:32,480 --> 00:46:35,599
object is being represented is not too
1152
00:46:35,599 --> 00:46:37,920
friendly now it could have been nicer if
1153
00:46:37,920 --> 00:46:40,560
we could somehow change the way that the
1154
00:46:40,560 --> 00:46:44,160
object is being represented in this list
1155
00:46:44,160 --> 00:46:46,240
here now there's actually a way to
1156
00:46:46,240 --> 00:46:49,119
achieve this by using a magic method
1157
00:46:49,119 --> 00:46:51,760
inside our class now there is a magic
1158
00:46:51,760 --> 00:46:53,680
method that is called
1159
00:46:53,680 --> 00:46:57,680
double underscore repr and repr stands
1160
00:46:57,680 --> 00:47:00,880
for representing your objects so that is
1161
00:47:00,880 --> 00:47:03,520
why you can actually go ahead and use
1162
00:47:03,520 --> 00:47:05,760
this magic method and then you will have
1163
00:47:05,760 --> 00:47:08,960
the control to display your objects when
1164
00:47:08,960 --> 00:47:11,440
you are printing them in the console now
1165
00:47:11,440 --> 00:47:13,599
i actually recommend watching a video
1166
00:47:13,599 --> 00:47:16,000
that compares between a method that is
1167
00:47:16,000 --> 00:47:17,920
similar to it which is called double
1168
00:47:17,920 --> 00:47:20,640
underscore str and you can take a look
1169
00:47:20,640 --> 00:47:22,960
in the description of this entire series
1170
00:47:22,960 --> 00:47:24,960
to actually watch the video that i'm
1171
00:47:24,960 --> 00:47:26,960
talking about all right so let's go
1172
00:47:26,960 --> 00:47:29,280
ahead and use the repair method to
1173
00:47:29,280 --> 00:47:31,119
understand how this is going to work so
1174
00:47:31,119 --> 00:47:33,760
i'm going to say def inside our class
1175
00:47:33,760 --> 00:47:36,480
and i'm going to use double underscore
1176
00:47:36,480 --> 00:47:40,319
re pr double underscore and as expected
1177
00:47:40,319 --> 00:47:43,440
it will receive the self now what we can
1178
00:47:43,440 --> 00:47:46,640
do now is returning a string that will
1179
00:47:46,640 --> 00:47:49,440
be responsible to represent this object
1180
00:47:49,440 --> 00:47:51,839
now obviously we don't want to use
1181
00:47:51,839 --> 00:47:54,559
something that is not unique for each of
1182
00:47:54,559 --> 00:47:57,040
the instances because say that i was to
1183
00:47:57,040 --> 00:48:00,000
use now return item something like that
1184
00:48:00,000 --> 00:48:01,119
and
1185
00:48:01,119 --> 00:48:03,200
run our program then you can see that
1186
00:48:03,200 --> 00:48:05,599
i'm going to receive a list with this
1187
00:48:05,599 --> 00:48:08,079
string five times but it is going to be
1188
00:48:08,079 --> 00:48:09,760
hard to identify
1189
00:48:09,760 --> 00:48:10,640
which
1190
00:48:10,640 --> 00:48:14,079
instance represents each string here so
1191
00:48:14,079 --> 00:48:16,240
it could be helpful if we were to return
1192
00:48:16,240 --> 00:48:18,800
a string that could be unique so i'm
1193
00:48:18,800 --> 00:48:21,839
going to close the console here and go
1194
00:48:21,839 --> 00:48:24,240
ahead here and use a formatted string
1195
00:48:24,240 --> 00:48:26,480
and in order to make this unique it is a
1196
00:48:26,480 --> 00:48:29,440
best practice to represent it exactly
1197
00:48:29,440 --> 00:48:32,319
like we create the instance
1198
00:48:32,319 --> 00:48:35,040
like that so what i'm going to do here
1199
00:48:35,040 --> 00:48:38,240
is leaving the item and use a
1200
00:48:38,240 --> 00:48:41,440
brackets opener and the closure and then
1201
00:48:41,440 --> 00:48:44,160
i'm going to make the return string here
1202
00:48:44,160 --> 00:48:47,040
as much as equal as possible to the way
1203
00:48:47,040 --> 00:48:48,400
that we create
1204
00:48:48,400 --> 00:48:52,079
those instances so i will start by
1205
00:48:52,079 --> 00:48:55,119
typing here single quotes to escape from
1206
00:48:55,119 --> 00:48:57,119
the double quotes that are coming from
1207
00:48:57,119 --> 00:49:00,240
here and i'm going to refer to the value
1208
00:49:00,240 --> 00:49:04,800
of name by using self.name and then i
1209
00:49:04,800 --> 00:49:07,839
will leave my single quotes and i will
1210
00:49:07,839 --> 00:49:09,040
use a
1211
00:49:09,040 --> 00:49:11,680
comma like that and then i will go ahead
1212
00:49:11,680 --> 00:49:15,040
and refer to the value of our price i
1213
00:49:15,040 --> 00:49:18,800
will use one more comma and i will say
1214
00:49:18,800 --> 00:49:20,720
self.quantity
1215
00:49:20,720 --> 00:49:24,240
now if we were to execute our program
1216
00:49:24,240 --> 00:49:27,359
again then you can see that now we
1217
00:49:27,359 --> 00:49:30,160
receive a list that is way more friendly
1218
00:49:30,160 --> 00:49:32,640
than what we have seen previously and
1219
00:49:32,640 --> 00:49:35,359
you can also see that this
1220
00:49:35,359 --> 00:49:38,000
first element for example is quite
1221
00:49:38,000 --> 00:49:41,040
equivalent to this line here now you
1222
00:49:41,040 --> 00:49:44,240
might be curious why i worked so hard to
1223
00:49:44,240 --> 00:49:47,359
return the representative version of our
1224
00:49:47,359 --> 00:49:50,240
objects the same way that we create them
1225
00:49:50,240 --> 00:49:51,839
so that is just a best practice
1226
00:49:51,839 --> 00:49:53,839
according to python's documentations
1227
00:49:53,839 --> 00:49:55,760
because it will help us to create
1228
00:49:55,760 --> 00:49:58,559
instances immediately by only the effort
1229
00:49:58,559 --> 00:50:01,040
of copying and pasting this to a python
1230
00:50:01,040 --> 00:50:03,119
console so if you think about it right
1231
00:50:03,119 --> 00:50:06,079
now if you open a python console and you
1232
00:50:06,079 --> 00:50:08,640
import this class then it will be as
1233
00:50:08,640 --> 00:50:10,880
easy as grabbing this
1234
00:50:10,880 --> 00:50:13,520
and pasting to the python console and
1235
00:50:13,520 --> 00:50:15,040
then you will have an instance being
1236
00:50:15,040 --> 00:50:17,359
created so that is the single reason
1237
00:50:17,359 --> 00:50:19,599
that i have came up with this approach
1238
00:50:19,599 --> 00:50:21,520
and also for sure i just wanted to
1239
00:50:21,520 --> 00:50:24,319
return a unique string that will really
1240
00:50:24,319 --> 00:50:26,880
represent our instance and you can see
1241
00:50:26,880 --> 00:50:29,520
that it is very easy to identify the
1242
00:50:29,520 --> 00:50:32,960
instances of our class with this list
1243
00:50:32,960 --> 00:50:35,200
and with this approach all right so
1244
00:50:35,200 --> 00:50:37,119
until this point we understood how we
1245
00:50:37,119 --> 00:50:39,680
can change the way that we represent our
1246
00:50:39,680 --> 00:50:42,000
objects and we also understood how we
1247
00:50:42,000 --> 00:50:45,359
can access to all of our instances by
1248
00:50:45,359 --> 00:50:47,599
this class attribute that we
1249
00:50:47,599 --> 00:50:50,800
intentionally named all now in this part
1250
00:50:50,800 --> 00:50:52,720
we are going to take a look to solve one
1251
00:50:52,720 --> 00:50:55,119
more problem that we have in terms of
1252
00:50:55,119 --> 00:50:56,880
best practices when we are going to
1253
00:50:56,880 --> 00:50:58,640
extend this application and add more
1254
00:50:58,640 --> 00:51:01,200
features now you can see that until this
1255
00:51:01,200 --> 00:51:05,520
point we maintain our data as code in
1256
00:51:05,520 --> 00:51:09,359
this main.py file by only instantiating
1257
00:51:09,359 --> 00:51:11,440
those five items now when we will look
1258
00:51:11,440 --> 00:51:13,359
to extend this application and add some
1259
00:51:13,359 --> 00:51:15,440
more features then we might have a
1260
00:51:15,440 --> 00:51:17,680
harder life to add those features
1261
00:51:17,680 --> 00:51:21,920
because the actual data and the code are
1262
00:51:21,920 --> 00:51:24,240
maintained in the same location meaning
1263
00:51:24,240 --> 00:51:27,119
in the same main.py file now you could
1264
00:51:27,119 --> 00:51:29,119
have think about creating a database
1265
00:51:29,119 --> 00:51:31,760
that will maintain this information but
1266
00:51:31,760 --> 00:51:33,680
i want to keep things more simple for
1267
00:51:33,680 --> 00:51:35,599
the purposes of this tutorial and that
1268
00:51:35,599 --> 00:51:37,200
is why i'm going to use something that
1269
00:51:37,200 --> 00:51:40,079
is called csv that you might have heard
1270
00:51:40,079 --> 00:51:40,800
of
1271
00:51:40,800 --> 00:51:44,000
csv stands for comma separated values so
1272
00:51:44,000 --> 00:51:45,920
this means that you could go ahead and
1273
00:51:45,920 --> 00:51:49,599
use a csv file and you could store your
1274
00:51:49,599 --> 00:51:52,559
values as comma separated where each
1275
00:51:52,559 --> 00:51:55,920
line will represent a single structured
1276
00:51:55,920 --> 00:51:58,559
data and csv is a great option here
1277
00:51:58,559 --> 00:52:01,200
because it allows the data to be saved
1278
00:52:01,200 --> 00:52:03,920
in a table structured format all right
1279
00:52:03,920 --> 00:52:06,800
so let's go ahead and create a csv file
1280
00:52:06,800 --> 00:52:08,800
and i will actually go ahead and name
1281
00:52:08,800 --> 00:52:10,359
this
1282
00:52:10,359 --> 00:52:13,520
items.csv like that and i will go ahead
1283
00:52:13,520 --> 00:52:15,760
and paste in some
1284
00:52:15,760 --> 00:52:18,880
csv content that will be responsible at
1285
00:52:18,880 --> 00:52:20,720
the end of the day represent the same
1286
00:52:20,720 --> 00:52:23,520
data that we look to have here so you
1287
00:52:23,520 --> 00:52:26,000
can see that at the first line i have
1288
00:52:26,000 --> 00:52:27,920
name price and quantity and you can see
1289
00:52:27,920 --> 00:52:31,119
that those are comma separated so those
1290
00:52:31,119 --> 00:52:32,880
represents the columns that we are going
1291
00:52:32,880 --> 00:52:35,040
to have as the data that we are going to
1292
00:52:35,040 --> 00:52:37,599
maintain and in the second line and
1293
00:52:37,599 --> 00:52:40,240
further we are going to have some data
1294
00:52:40,240 --> 00:52:42,800
that will represent the actual data that
1295
00:52:42,800 --> 00:52:46,319
we look to maintain so if we were to now
1296
00:52:46,319 --> 00:52:48,880
split the panes then we can see that
1297
00:52:48,880 --> 00:52:51,599
those are quite equivalent and now we
1298
00:52:51,599 --> 00:52:54,400
should only look for a way to read this
1299
00:52:54,400 --> 00:52:57,920
csv file and actually instantiate those
1300
00:52:57,920 --> 00:53:00,319
objects now you can see that i have a
1301
00:53:00,319 --> 00:53:02,960
suggestion by pycharm to install a
1302
00:53:02,960 --> 00:53:05,280
plugin that will support csv files so
1303
00:53:05,280 --> 00:53:07,599
i'm going to just click on that and
1304
00:53:07,599 --> 00:53:10,160
install those plugins and you can see
1305
00:53:10,160 --> 00:53:13,040
that i will have a csv reader here and
1306
00:53:13,040 --> 00:53:15,280
we will see if we will be able to see
1307
00:53:15,280 --> 00:53:18,800
this data in a table which will be a lot
1308
00:53:18,800 --> 00:53:20,880
nicer so let's go ahead and install this
1309
00:53:20,880 --> 00:53:22,559
and now you can see that i have some
1310
00:53:22,559 --> 00:53:24,960
more options that i can actually go
1311
00:53:24,960 --> 00:53:27,599
ahead and use from here i know that this
1312
00:53:27,599 --> 00:53:30,240
is quite small but actually you have
1313
00:53:30,240 --> 00:53:32,400
some tabs that you can go ahead and
1314
00:53:32,400 --> 00:53:34,559
click on them and if i was to click on
1315
00:53:34,559 --> 00:53:37,760
table editor and actually
1316
00:53:37,760 --> 00:53:39,200
give this
1317
00:53:39,200 --> 00:53:41,920
file more focus then you can see that i
1318
00:53:41,920 --> 00:53:44,880
actually have the best way to read this
1319
00:53:44,880 --> 00:53:47,920
data now you can see that i have my
1320
00:53:47,920 --> 00:53:51,839
columns you can see that i have my rows
1321
00:53:51,839 --> 00:53:54,079
and that is quite nice now i can really
1322
00:53:54,079 --> 00:53:56,640
go ahead and visualize my data more
1323
00:53:56,640 --> 00:53:59,280
nicer and it is just more common way to
1324
00:53:59,280 --> 00:54:02,400
maintain your data okay so now that we
1325
00:54:02,400 --> 00:54:05,359
understood how csv files are working
1326
00:54:05,359 --> 00:54:07,599
let's go ahead and read our csv files
1327
00:54:07,599 --> 00:54:09,760
and instantiate the instances in a
1328
00:54:09,760 --> 00:54:12,720
generic way so it makes sense to delete
1329
00:54:12,720 --> 00:54:15,599
those five lines and i'm going to use
1330
00:54:15,599 --> 00:54:16,960
those lines
1331
00:54:16,960 --> 00:54:20,160
below the apply discount and use a
1332
00:54:20,160 --> 00:54:23,359
method that i could name instantiate
1333
00:54:23,359 --> 00:54:24,960
from csv
1334
00:54:24,960 --> 00:54:28,319
like that now you can see that this one
1335
00:54:28,319 --> 00:54:30,800
is also going to receive self because if
1336
00:54:30,800 --> 00:54:32,880
you remember i said that in each method
1337
00:54:32,880 --> 00:54:35,440
that we will design we need to receive
1338
00:54:35,440 --> 00:54:38,880
at least one parameter that will be
1339
00:54:38,880 --> 00:54:42,400
passed as the instance itself because
1340
00:54:42,400 --> 00:54:46,079
this is how python oop works now the
1341
00:54:46,079 --> 00:54:48,319
problem is we are not going to have any
1342
00:54:48,319 --> 00:54:51,119
instances on our hand to call this
1343
00:54:51,119 --> 00:54:53,599
method from the instance because this
1344
00:54:53,599 --> 00:54:55,440
method is actually designed for
1345
00:54:55,440 --> 00:54:58,480
instantiating the object itself so this
1346
00:54:58,480 --> 00:55:00,799
means that this method could not be
1347
00:55:00,799 --> 00:55:03,520
called from an instance so the way that
1348
00:55:03,520 --> 00:55:06,400
this is going to be solved is by
1349
00:55:06,400 --> 00:55:09,359
converting this method into a class
1350
00:55:09,359 --> 00:55:12,799
method now a class method is a method
1351
00:55:12,799 --> 00:55:16,319
that could be accessed in the following
1352
00:55:16,319 --> 00:55:18,880
way so i will use this line to delete
1353
00:55:18,880 --> 00:55:21,520
that and it could be accessed from the
1354
00:55:21,520 --> 00:55:22,880
class level
1355
00:55:22,880 --> 00:55:25,920
only so this will look like item
1356
00:55:25,920 --> 00:55:29,119
dot instantiate from csv and then in
1357
00:55:29,119 --> 00:55:32,160
here we will probably pass our csv file
1358
00:55:32,160 --> 00:55:34,559
so this method should take full
1359
00:55:34,559 --> 00:55:37,119
responsibility to instantiate those
1360
00:55:37,119 --> 00:55:39,839
objects for us so now that we understood
1361
00:55:39,839 --> 00:55:42,079
this let's go ahead and see how we can
1362
00:55:42,079 --> 00:55:44,880
create a class method so for sure we
1363
00:55:44,880 --> 00:55:47,520
need to delete the self and i know that
1364
00:55:47,520 --> 00:55:49,520
we have errors but we are going to solve
1365
00:55:49,520 --> 00:55:52,240
each one of those just in a second now
1366
00:55:52,240 --> 00:55:54,319
in order to convert this to a class
1367
00:55:54,319 --> 00:55:57,520
method we need to use a decorator that
1368
00:55:57,520 --> 00:56:00,000
will be responsible to convert this
1369
00:56:00,000 --> 00:56:01,920
method into a class method now
1370
00:56:01,920 --> 00:56:04,799
decorators in python is just a quick way
1371
00:56:04,799 --> 00:56:06,960
to change the behavior of the functions
1372
00:56:06,960 --> 00:56:09,520
that we will write by basically calling
1373
00:56:09,520 --> 00:56:12,160
them just before the line that we create
1374
00:56:12,160 --> 00:56:15,119
our function so we could use the add
1375
00:56:15,119 --> 00:56:18,160
sign and use the class method
1376
00:56:18,160 --> 00:56:20,880
in here and then this instant sheet from
1377
00:56:20,880 --> 00:56:23,680
csv method will be a class method all
1378
00:56:23,680 --> 00:56:25,760
right so now that we understood this
1379
00:56:25,760 --> 00:56:27,680
then we should also understand one more
1380
00:56:27,680 --> 00:56:30,079
piece of information before we go ahead
1381
00:56:30,079 --> 00:56:32,400
and design this method now i want to
1382
00:56:32,400 --> 00:56:34,960
show you what will happen if i was to
1383
00:56:34,960 --> 00:56:37,440
delete the entire name and try to
1384
00:56:37,440 --> 00:56:39,920
recreate this function here and i will
1385
00:56:39,920 --> 00:56:42,160
just say instantiate
1386
00:56:42,160 --> 00:56:45,040
from csv again now pay attention what
1387
00:56:45,040 --> 00:56:46,640
will happen if i was to open up and
1388
00:56:46,640 --> 00:56:48,720
close the parentheses now you can see
1389
00:56:48,720 --> 00:56:51,520
that it still receives a parameter but
1390
00:56:51,520 --> 00:56:55,119
this time it is named cls
1391
00:56:55,119 --> 00:56:57,440
now what is going on here and the thing
1392
00:56:57,440 --> 00:57:00,160
that is going on here is the fact that
1393
00:57:00,160 --> 00:57:03,119
when we call our class methods then the
1394
00:57:03,119 --> 00:57:04,079
class
1395
00:57:04,079 --> 00:57:06,799
object itself is passed as a first
1396
00:57:06,799 --> 00:57:09,599
argument always in the background so it
1397
00:57:09,599 --> 00:57:12,480
is a bit like the instance where it is
1398
00:57:12,480 --> 00:57:14,880
also passed as the first argument but
1399
00:57:14,880 --> 00:57:17,280
this time when we call a class method in
1400
00:57:17,280 --> 00:57:20,079
this approach then the class reference
1401
00:57:20,079 --> 00:57:22,960
must be passed as a first argument so
1402
00:57:22,960 --> 00:57:26,000
that is why you should still receive at
1403
00:57:26,000 --> 00:57:28,640
least one parameter but we probably
1404
00:57:28,640 --> 00:57:30,640
understand that we could not name this
1405
00:57:30,640 --> 00:57:32,799
self because that is just going to be
1406
00:57:32,799 --> 00:57:35,599
too much confusing okay so now let's go
1407
00:57:35,599 --> 00:57:38,079
ahead and write some code to read the
1408
00:57:38,079 --> 00:57:40,960
csv file and instantiate some objects
1409
00:57:40,960 --> 00:57:43,119
now i'm going to go up top first and i'm
1410
00:57:43,119 --> 00:57:46,720
going to import a library that is called
1411
00:57:46,720 --> 00:57:50,079
csv so i will go here and i will use an
1412
00:57:50,079 --> 00:57:52,880
import csv line because that will be the
1413
00:57:52,880 --> 00:57:54,240
library that will take full
1414
00:57:54,240 --> 00:57:57,200
responsibility to read the csv file and
1415
00:57:57,200 --> 00:57:59,359
then we will see how we can instantiate
1416
00:57:59,359 --> 00:58:01,920
some objects all right so now i can go
1417
00:58:01,920 --> 00:58:05,040
ahead and use a context manager to read
1418
00:58:05,040 --> 00:58:08,079
the items.csv file now both of those
1419
00:58:08,079 --> 00:58:10,240
files are located in the same location
1420
00:58:10,240 --> 00:58:13,040
so i can just directly say wait open
1421
00:58:13,040 --> 00:58:15,200
items dot csv
1422
00:58:15,200 --> 00:58:17,440
and the permission that i will be
1423
00:58:17,440 --> 00:58:19,520
passing here could be r because we only
1424
00:58:19,520 --> 00:58:22,640
look to read this and i will say as
1425
00:58:22,640 --> 00:58:23,680
f
1426
00:58:23,680 --> 00:58:27,680
like that now inside this open i will go
1427
00:58:27,680 --> 00:58:30,799
ahead and use some method to directly
1428
00:58:30,799 --> 00:58:33,200
read this csv which at the end of the
1429
00:58:33,200 --> 00:58:35,680
day will be responsible to convert this
1430
00:58:35,680 --> 00:58:38,640
into a python dictionary so i will say
1431
00:58:38,640 --> 00:58:41,920
reader is equal to csv
1432
00:58:41,920 --> 00:58:46,240
dot dict reader like that and i will
1433
00:58:46,240 --> 00:58:49,839
pass in the content of our file like
1434
00:58:49,839 --> 00:58:52,559
that now this method should go ahead and
1435
00:58:52,559 --> 00:58:55,440
read our content as a list of
1436
00:58:55,440 --> 00:58:57,520
dictionaries but at the end of the day
1437
00:58:57,520 --> 00:58:59,200
we should also go ahead and convert this
1438
00:58:59,200 --> 00:59:00,880
into a list so i will go ahead and
1439
00:59:00,880 --> 00:59:02,559
create one more variable that will be
1440
00:59:02,559 --> 00:59:05,520
equal to items and i will just convert
1441
00:59:05,520 --> 00:59:08,960
the reader into a list and that's it and
1442
00:59:08,960 --> 00:59:10,799
now that we have completed the actions
1443
00:59:10,799 --> 00:59:12,880
that we wanted to complete by reading
1444
00:59:12,880 --> 00:59:16,480
this csv file let's go ahead and use a
1445
00:59:16,480 --> 00:59:19,680
shift tab to indent out and now before
1446
00:59:19,680 --> 00:59:22,000
we go ahead and instantiate some objects
1447
00:59:22,000 --> 00:59:23,680
let's go ahead and see the results of
1448
00:59:23,680 --> 00:59:26,640
iterating over the items list now i will
1449
00:59:26,640 --> 00:59:29,839
go ahead and use for item in
1450
00:59:29,839 --> 00:59:30,880
items
1451
00:59:30,880 --> 00:59:33,599
and then i will just use print items to
1452
00:59:33,599 --> 00:59:36,160
show you the behavior of that and excuse
1453
00:59:36,160 --> 00:59:38,799
me it should be item all right so now
1454
00:59:38,799 --> 00:59:40,799
that we understood this then let's go
1455
00:59:40,799 --> 00:59:42,559
ahead and see what we have in those
1456
00:59:42,559 --> 00:59:45,200
lines so after our class definition we
1457
00:59:45,200 --> 00:59:46,839
only go ahead and call this
1458
00:59:46,839 --> 00:59:50,000
item.instantiate from csv method so if i
1459
00:59:50,000 --> 00:59:50,960
was to
1460
00:59:50,960 --> 00:59:53,760
run that then you can see that i receive
1461
00:59:53,760 --> 00:59:56,400
some dictionaries in separated lines and
1462
00:59:56,400 --> 00:59:59,119
that is because i iterate over a list of
1463
00:59:59,119 --> 01:00:01,440
dictionaries in here and that is just
1464
01:00:01,440 --> 01:00:03,599
perfect all right so the only thing that
1465
01:00:03,599 --> 01:00:07,040
we miss right now is creating instances
1466
01:00:07,040 --> 01:00:09,599
now besides printing those then we could
1467
01:00:09,599 --> 01:00:12,880
now say something like item and open up
1468
01:00:12,880 --> 01:00:14,400
and close parentheses
1469
01:00:14,400 --> 01:00:16,480
and this should be enough to instantiate
1470
01:00:16,480 --> 01:00:19,359
our instances now i can go ahead and
1471
01:00:19,359 --> 01:00:22,400
pass my arguments in here by basically
1472
01:00:22,400 --> 01:00:25,440
reading the keys from a dictionary so i
1473
01:00:25,440 --> 01:00:27,280
can say name
1474
01:00:27,280 --> 01:00:30,319
is equal to item dot get
1475
01:00:30,319 --> 01:00:32,079
and that will
1476
01:00:32,079 --> 01:00:35,359
receive name and now i can add a comma
1477
01:00:35,359 --> 01:00:39,280
and duplicate this line twice and change
1478
01:00:39,280 --> 01:00:42,319
those accordingly so this will be price
1479
01:00:42,319 --> 01:00:45,200
and this will be quantity and now i need
1480
01:00:45,200 --> 01:00:48,400
to replace my key names so it will be
1481
01:00:48,400 --> 01:00:52,480
price here and then quantity right there
1482
01:00:52,480 --> 01:00:54,480
and now let's go ahead and see what will
1483
01:00:54,480 --> 01:00:57,839
happen if i was to call this method and
1484
01:00:57,839 --> 01:01:00,559
as well as calling the attribute of
1485
01:01:00,559 --> 01:01:02,319
item.all
1486
01:01:02,319 --> 01:01:04,480
because this one stores all the
1487
01:01:04,480 --> 01:01:07,359
instances inside the list now if i was
1488
01:01:07,359 --> 01:01:10,160
to go ahead and run it then you can see
1489
01:01:10,160 --> 01:01:13,680
that i have some errors now you'll see
1490
01:01:13,680 --> 01:01:18,240
that the errors are related to the price
1491
01:01:18,240 --> 01:01:20,480
and you can see that we receive is not
1492
01:01:20,480 --> 01:01:23,599
greater than or equal to zero now let's
1493
01:01:23,599 --> 01:01:25,680
go ahead and fix this very quickly so in
1494
01:01:25,680 --> 01:01:28,640
the items.csv you can see that those are
1495
01:01:28,640 --> 01:01:31,599
actually integers that are greater than
1496
01:01:31,599 --> 01:01:34,240
zero so the problem is probably the fact
1497
01:01:34,240 --> 01:01:37,280
that those are passed as strings so we
1498
01:01:37,280 --> 01:01:40,079
need to go ahead and pass those as
1499
01:01:40,079 --> 01:01:43,200
integers so i'm going to convert those
1500
01:01:43,200 --> 01:01:44,160
into
1501
01:01:44,160 --> 01:01:45,040
int
1502
01:01:45,040 --> 01:01:47,119
like that and
1503
01:01:47,119 --> 01:01:48,799
now let's go ahead and see if we will
1504
01:01:48,799 --> 01:01:50,960
have any problems as i expect to have
1505
01:01:50,960 --> 01:01:53,440
any problem because the quantity should
1506
01:01:53,440 --> 01:01:55,359
complain about the same thing and you
1507
01:01:55,359 --> 01:01:57,039
can see that this is exactly what is
1508
01:01:57,039 --> 01:02:00,960
going on here so i can use the same for
1509
01:02:00,960 --> 01:02:02,799
quantity
1510
01:02:02,799 --> 01:02:05,200
like that and
1511
01:02:05,200 --> 01:02:08,000
work with that and you can see that now
1512
01:02:08,000 --> 01:02:11,039
we see our instances perfectly now i
1513
01:02:11,039 --> 01:02:12,559
want to show one more problem that we
1514
01:02:12,559 --> 01:02:14,480
could have in the future and we should
1515
01:02:14,480 --> 01:02:17,280
avoid now so those three lines are going
1516
01:02:17,280 --> 01:02:19,359
to work with this
1517
01:02:19,359 --> 01:02:22,559
structure of data but if i was to change
1518
01:02:22,559 --> 01:02:25,280
the price of our keyboard to something
1519
01:02:25,280 --> 01:02:27,240
like
1520
01:02:27,240 --> 01:02:30,000
74.90 something like that
1521
01:02:30,000 --> 01:02:33,119
and re-execute our
1522
01:02:33,119 --> 01:02:34,880
file then you can see that we will
1523
01:02:34,880 --> 01:02:37,119
receive some problems so we need to
1524
01:02:37,119 --> 01:02:39,520
convert the price not to an integer but
1525
01:02:39,520 --> 01:02:42,480
to a float like that and that is the
1526
01:02:42,480 --> 01:02:44,559
only way to get over this because we
1527
01:02:44,559 --> 01:02:46,319
don't want to convert the price to an
1528
01:02:46,319 --> 01:02:48,880
integer directly because it could be
1529
01:02:48,880 --> 01:02:52,720
float so now we could go ahead and
1530
01:02:52,720 --> 01:02:54,480
execute and you can see that now it
1531
01:02:54,480 --> 01:02:57,680
works perfectly although we see the
1532
01:02:57,680 --> 01:03:00,640
prices as 100.0
1533
01:03:00,640 --> 01:03:02,480
but that is something that we will look
1534
01:03:02,480 --> 01:03:04,319
into it in the future but for now it
1535
01:03:04,319 --> 01:03:06,240
works perfect and now we are ready to
1536
01:03:06,240 --> 01:03:09,280
jump on to our next topic okay so now
1537
01:03:09,280 --> 01:03:11,200
that we completely understood the class
1538
01:03:11,200 --> 01:03:13,039
methods let's go ahead and also
1539
01:03:13,039 --> 01:03:15,839
understand what static methods are now a
1540
01:03:15,839 --> 01:03:18,079
static method should do some work for
1541
01:03:18,079 --> 01:03:20,720
you that has some logical connection to
1542
01:03:20,720 --> 01:03:23,599
a class so for example if you want to
1543
01:03:23,599 --> 01:03:26,000
check if a number is an integer or a
1544
01:03:26,000 --> 01:03:28,400
float then this is a good candidate for
1545
01:03:28,400 --> 01:03:30,960
creating a static method because this
1546
01:03:30,960 --> 01:03:33,520
has some connection to the class that we
1547
01:03:33,520 --> 01:03:35,839
work with so it makes sense to check if
1548
01:03:35,839 --> 01:03:39,920
a price of an item has a decimal point
1549
01:03:39,920 --> 01:03:42,880
and by saying has a decimal point i
1550
01:03:42,880 --> 01:03:46,160
obviously count out those that are point
1551
01:03:46,160 --> 01:03:49,440
zero now to be honest static and class
1552
01:03:49,440 --> 01:03:51,839
methods could look very alike to you but
1553
01:03:51,839 --> 01:03:54,000
we will explain the main differences
1554
01:03:54,000 --> 01:03:57,200
very soon okay so i will use those lines
1555
01:03:57,200 --> 01:04:00,000
to create our first static method now
1556
01:04:00,000 --> 01:04:02,960
let's go ahead and use the def keyword
1557
01:04:02,960 --> 01:04:05,039
and we will name this method is
1558
01:04:05,039 --> 01:04:06,880
underscore integer because we said that
1559
01:04:06,880 --> 01:04:08,559
we'd like to write a static method that
1560
01:04:08,559 --> 01:04:11,119
will check if a received number is an
1561
01:04:11,119 --> 01:04:13,520
integer or not now if i was to open up
1562
01:04:13,520 --> 01:04:15,280
and close parentheses this would
1563
01:04:15,280 --> 01:04:17,760
obviously receive itself now i want you
1564
01:04:17,760 --> 01:04:20,160
to take a closer look what will happen
1565
01:04:20,160 --> 01:04:21,760
if i was to change this method into
1566
01:04:21,760 --> 01:04:23,839
being a static method and the approach
1567
01:04:23,839 --> 01:04:25,440
is going to be pretty much the same like
1568
01:04:25,440 --> 01:04:26,400
we have done
1569
01:04:26,400 --> 01:04:28,480
with the class method we will use a
1570
01:04:28,480 --> 01:04:31,039
decorator that is called static method
1571
01:04:31,039 --> 01:04:32,720
and this should be responsible to the
1572
01:04:32,720 --> 01:04:35,680
conversion so i will go ahead and
1573
01:04:35,680 --> 01:04:39,039
use this line and i will say at static
1574
01:04:39,039 --> 01:04:42,400
method like that now pay attention
1575
01:04:42,400 --> 01:04:45,839
how the received perimeter turned into
1576
01:04:45,839 --> 01:04:48,000
the regular orange color that we are
1577
01:04:48,000 --> 01:04:50,480
familiar because that is just a regular
1578
01:04:50,480 --> 01:04:53,599
parameter that we receive now this means
1579
01:04:53,599 --> 01:04:56,480
that the static methods are never
1580
01:04:56,480 --> 01:04:59,760
sending in the background the instance
1581
01:04:59,760 --> 01:05:03,520
as a first argument and that is unlike
1582
01:05:03,520 --> 01:05:06,400
the class methods the class methods are
1583
01:05:06,400 --> 01:05:09,680
sending the class reference as a first
1584
01:05:09,680 --> 01:05:11,760
argument and that is why we had to
1585
01:05:11,760 --> 01:05:15,039
receive the cls and that is why it is
1586
01:05:15,039 --> 01:05:17,599
intentionally colored with purple but
1587
01:05:17,599 --> 01:05:20,319
with static methods we never send the
1588
01:05:20,319 --> 01:05:23,920
object as the first argument so that is
1589
01:05:23,920 --> 01:05:26,720
why we should relate to the static
1590
01:05:26,720 --> 01:05:29,839
method like a regular function that just
1591
01:05:29,839 --> 01:05:32,079
receives parameters like we are familiar
1592
01:05:32,079 --> 01:05:34,640
with isolated functions now i will go
1593
01:05:34,640 --> 01:05:36,880
deeper on this just in a few minutes but
1594
01:05:36,880 --> 01:05:38,799
let's go ahead and finish up our static
1595
01:05:38,799 --> 01:05:41,599
method first so this should receive
1596
01:05:41,599 --> 01:05:44,079
num as one parameter because we should
1597
01:05:44,079 --> 01:05:45,680
receive at least something to check if
1598
01:05:45,680 --> 01:05:48,079
it is an integer or not all right so now
1599
01:05:48,079 --> 01:05:50,400
that we are inside this method
1600
01:05:50,400 --> 01:05:52,480
then i can go ahead and use a couple of
1601
01:05:52,480 --> 01:05:54,880
if statements to check if the received
1602
01:05:54,880 --> 01:05:57,520
argument is an integer or not now if you
1603
01:05:57,520 --> 01:06:00,079
remember we said that we'd like to
1604
01:06:00,079 --> 01:06:02,079
we will count
1605
01:06:02,079 --> 01:06:04,960
out the floats that are
1606
01:06:04,960 --> 01:06:08,640
decimal that are 0.0 okay
1607
01:06:08,640 --> 01:06:10,400
meaning
1608
01:06:10,400 --> 01:06:13,200
for example 5.0
1609
01:06:13,200 --> 01:06:16,559
10.0 and so on all right so now that we
1610
01:06:16,559 --> 01:06:19,119
understood this let's go ahead and use
1611
01:06:19,119 --> 01:06:21,599
an if statement here so if and we will
1612
01:06:21,599 --> 01:06:23,359
call the built in function that is
1613
01:06:23,359 --> 01:06:25,680
called is instance
1614
01:06:25,680 --> 01:06:28,319
and this should receive two arguments
1615
01:06:28,319 --> 01:06:30,000
and we can understand what this function
1616
01:06:30,000 --> 01:06:32,079
is going to do for us it is going to
1617
01:06:32,079 --> 01:06:33,839
check if the
1618
01:06:33,839 --> 01:06:37,280
received parameter is an instance of a
1619
01:06:37,280 --> 01:06:40,640
float or an integer so we will pass in
1620
01:06:40,640 --> 01:06:43,200
as the first argument the num and as the
1621
01:06:43,200 --> 01:06:45,039
second argument the flow
1622
01:06:45,039 --> 01:06:47,280
without calling those parentheses so
1623
01:06:47,280 --> 01:06:50,720
only the reference to the float keyword
1624
01:06:50,720 --> 01:06:53,680
so this conditional should go ahead and
1625
01:06:53,680 --> 01:06:56,400
check if the num is a floating number or
1626
01:06:56,400 --> 01:06:57,200
not
1627
01:06:57,200 --> 01:07:00,000
now inside this if statement i will say
1628
01:07:00,000 --> 01:07:01,039
return
1629
01:07:01,039 --> 01:07:02,000
num
1630
01:07:02,000 --> 01:07:03,359
dot is
1631
01:07:03,359 --> 01:07:06,960
integer so by saying dot is integer then
1632
01:07:06,960 --> 01:07:08,640
i basically say
1633
01:07:08,640 --> 01:07:12,720
count out the floats that are decimal
1634
01:07:12,720 --> 01:07:15,200
that are point zero
1635
01:07:15,200 --> 01:07:17,839
so this means that if i was to pass in
1636
01:07:17,839 --> 01:07:21,039
here a number like 10.0 then this will
1637
01:07:21,039 --> 01:07:23,760
return false but remember that this will
1638
01:07:23,760 --> 01:07:25,520
enter here because it thinks it is a
1639
01:07:25,520 --> 01:07:27,520
float because it is represented in that
1640
01:07:27,520 --> 01:07:30,720
way and so the is underscore integer
1641
01:07:30,720 --> 01:07:33,920
should check if the point is zero and it
1642
01:07:33,920 --> 01:07:36,240
should return false accordingly now i
1643
01:07:36,240 --> 01:07:38,640
will also use an else if statement here
1644
01:07:38,640 --> 01:07:41,119
to basically check if it is integer by
1645
01:07:41,119 --> 01:07:45,280
itself so i will say el if is
1646
01:07:45,280 --> 01:07:46,799
instance num
1647
01:07:46,799 --> 01:07:49,200
and check if it is an instance of an
1648
01:07:49,200 --> 01:07:53,520
integer then i will just return true and
1649
01:07:53,520 --> 01:07:55,599
if it is just something else then i will
1650
01:07:55,599 --> 01:07:56,880
just say
1651
01:07:56,880 --> 01:07:59,920
return false like that so now that we
1652
01:07:59,920 --> 01:08:01,839
have designed this method then let's
1653
01:08:01,839 --> 01:08:05,359
take a look how we can call it so now i
1654
01:08:05,359 --> 01:08:08,319
will just remove this and this i'm not
1655
01:08:08,319 --> 01:08:10,079
actually going to instantiate anything
1656
01:08:10,079 --> 01:08:12,319
i'm just going to show you how you can
1657
01:08:12,319 --> 01:08:14,799
access to the static method so i will
1658
01:08:14,799 --> 01:08:19,120
just call this item dot is integer and i
1659
01:08:19,120 --> 01:08:21,520
will just pass in a number that i would
1660
01:08:21,520 --> 01:08:24,080
like to check if it is an integer or not
1661
01:08:24,080 --> 01:08:26,799
now for sure we like to print this so we
1662
01:08:26,799 --> 01:08:28,880
will see the result now let's go ahead
1663
01:08:28,880 --> 01:08:30,799
and pass in seven
1664
01:08:30,799 --> 01:08:33,520
so you can see that we receive true now
1665
01:08:33,520 --> 01:08:36,319
if i was to pass in 7.5 then i would
1666
01:08:36,319 --> 01:08:38,640
receive false and what is happening in
1667
01:08:38,640 --> 01:08:40,880
the background it is the fact that it
1668
01:08:40,880 --> 01:08:44,158
enters here but it sees that it is not
1669
01:08:44,158 --> 01:08:47,279
an integer so it returns false but if i
1670
01:08:47,279 --> 01:08:50,319
was to change this to 7.0
1671
01:08:50,319 --> 01:08:53,120
then this should sorry about that this
1672
01:08:53,120 --> 01:08:54,960
should still return
1673
01:08:54,960 --> 01:08:57,198
true because what is happening it is
1674
01:08:57,198 --> 01:08:59,600
entering inside this conditional and
1675
01:08:59,600 --> 01:09:02,158
then it checks if it is an integer but
1676
01:09:02,158 --> 01:09:04,479
we said that this method counts out the
1677
01:09:04,479 --> 01:09:08,158
floats that are 0.0 so it returns true
1678
01:09:08,158 --> 01:09:10,479
still so that is a perfect design all
1679
01:09:10,479 --> 01:09:13,439
right so i have came up with a new file
1680
01:09:13,439 --> 01:09:15,359
which i will just explain here when to
1681
01:09:15,359 --> 01:09:17,198
use a class method and when to use a
1682
01:09:17,198 --> 01:09:19,120
static method so we can completely
1683
01:09:19,120 --> 01:09:20,799
understand the differences between those
1684
01:09:20,799 --> 01:09:22,799
because i remember myself i had a very
1685
01:09:22,799 --> 01:09:25,679
tough time to understand why i need this
1686
01:09:25,679 --> 01:09:28,238
and why i need the other one so that
1687
01:09:28,238 --> 01:09:29,600
will be the main question that i will be
1688
01:09:29,600 --> 01:09:31,679
answering in this python file so don't
1689
01:09:31,679 --> 01:09:33,920
feel like you have to copy and paste the
1690
01:09:33,920 --> 01:09:35,839
code following along what i am
1691
01:09:35,839 --> 01:09:37,679
explaining here by listening should be
1692
01:09:37,679 --> 01:09:40,238
enough all right so in this file i will
1693
01:09:40,238 --> 01:09:43,520
just go ahead and create this class item
1694
01:09:43,520 --> 01:09:45,040
that we have
1695
01:09:45,040 --> 01:09:47,679
right and i will use pass to not receive
1696
01:09:47,679 --> 01:09:50,640
errors now when we will use a static
1697
01:09:50,640 --> 01:09:53,600
method so we will use a static method
1698
01:09:53,600 --> 01:09:56,880
when we want to do something that should
1699
01:09:56,880 --> 01:09:59,679
not be unique per instance exactly like
1700
01:09:59,679 --> 01:10:02,880
we have done previously so each integer
1701
01:10:02,880 --> 01:10:05,040
is a method that is just going to be
1702
01:10:05,040 --> 01:10:07,040
responsible to check if a number is
1703
01:10:07,040 --> 01:10:09,360
integer or not so that is why i could
1704
01:10:09,360 --> 01:10:12,239
allow myself to include this under the
1705
01:10:12,239 --> 01:10:15,280
item just like i could use this def as
1706
01:10:15,280 --> 01:10:17,360
an isolated function right above the
1707
01:10:17,360 --> 01:10:20,480
class and that was also okay but i
1708
01:10:20,480 --> 01:10:23,120
prefer to not do that because although
1709
01:10:23,120 --> 01:10:25,840
this is a method that has nothing to do
1710
01:10:25,840 --> 01:10:29,199
with instance that is somehow related to
1711
01:10:29,199 --> 01:10:32,640
the item class so that is the reason you
1712
01:10:32,640 --> 01:10:35,440
want to create this as a static method
1713
01:10:35,440 --> 01:10:38,480
like we have designed previously and the
1714
01:10:38,480 --> 01:10:40,719
reason that you would like to create a
1715
01:10:40,719 --> 01:10:42,000
class method
1716
01:10:42,000 --> 01:10:45,520
is for instantiating instances from some
1717
01:10:45,520 --> 01:10:48,880
structured data that you own so exactly
1718
01:10:48,880 --> 01:10:50,719
like we have done we have created a
1719
01:10:50,719 --> 01:10:53,120
class method that was responsible to
1720
01:10:53,120 --> 01:10:56,320
read the csv file and creating some
1721
01:10:56,320 --> 01:11:00,080
instances so as i wrote here those are
1722
01:11:00,080 --> 01:11:02,800
used to manipulate different structures
1723
01:11:02,800 --> 01:11:05,840
of data to instantiate objects like we
1724
01:11:05,840 --> 01:11:08,000
have done with the csv file we could
1725
01:11:08,000 --> 01:11:10,320
also use a class method like install
1726
01:11:10,320 --> 01:11:12,560
sheet from a json file
1727
01:11:12,560 --> 01:11:15,920
or from a yaml file those just are
1728
01:11:15,920 --> 01:11:18,800
different ways to maintain data in the
1729
01:11:18,800 --> 01:11:20,960
best practice way and that is the code
1730
01:11:20,960 --> 01:11:23,040
that you look to include inside your
1731
01:11:23,040 --> 01:11:26,000
class methods that is why they should be
1732
01:11:26,000 --> 01:11:28,640
existing in any class especially if you
1733
01:11:28,640 --> 01:11:31,280
look to instantiate hundreds of objects
1734
01:11:31,280 --> 01:11:33,600
on your programs so it is a great idea
1735
01:11:33,600 --> 01:11:36,560
to have at least one class method like
1736
01:11:36,560 --> 01:11:40,159
we have done in the item class now the
1737
01:11:40,159 --> 01:11:43,520
only main difference between a class
1738
01:11:43,520 --> 01:11:46,880
method and to a static method is the
1739
01:11:46,880 --> 01:11:49,600
fact that static methods are not passing
1740
01:11:49,600 --> 01:11:51,760
the object reference as the first
1741
01:11:51,760 --> 01:11:54,000
argument in the background it is
1742
01:11:54,000 --> 01:11:56,080
noticeable from the fact that we don't
1743
01:11:56,080 --> 01:11:58,719
have a special highlight purple in my
1744
01:11:58,719 --> 01:12:02,159
case for the first parameter so if you
1745
01:12:02,159 --> 01:12:04,640
remember if i was to go ahead and use
1746
01:12:04,640 --> 01:12:07,199
here a first parameter like num then you
1747
01:12:07,199 --> 01:12:08,719
will see that this is the first
1748
01:12:08,719 --> 01:12:10,719
parameter that is colored with orange
1749
01:12:10,719 --> 01:12:13,040
because that is a regular parameter but
1750
01:12:13,040 --> 01:12:15,520
that is purple because this is a
1751
01:12:15,520 --> 01:12:17,280
mandatory parameter that we should
1752
01:12:17,280 --> 01:12:19,360
receive because what i have just
1753
01:12:19,360 --> 01:12:21,679
explained so those are the main
1754
01:12:21,679 --> 01:12:24,560
differences between a static method to a
1755
01:12:24,560 --> 01:12:26,480
class method now if you remember i
1756
01:12:26,480 --> 01:12:28,640
intentionally said that the class
1757
01:12:28,640 --> 01:12:30,560
methods and the static methods could
1758
01:12:30,560 --> 01:12:33,280
only be called from the class level but
1759
01:12:33,280 --> 01:12:36,159
however those also could be called from
1760
01:12:36,159 --> 01:12:39,040
instances so as you can see i can
1761
01:12:39,040 --> 01:12:41,280
actually instantiate an object and call
1762
01:12:41,280 --> 01:12:42,960
the is integer and as well as the
1763
01:12:42,960 --> 01:12:44,800
instant sheet from something you can
1764
01:12:44,800 --> 01:12:46,719
just pass in here a number like five and
1765
01:12:46,719 --> 01:12:48,880
i will not receive any errors and if i
1766
01:12:48,880 --> 01:12:50,719
was to run the helper then you can see
1767
01:12:50,719 --> 01:12:53,120
that i don't have any error now i'm
1768
01:12:53,120 --> 01:12:55,360
going to be honest with you i never saw
1769
01:12:55,360 --> 01:12:58,400
a reason to call a static method or a
1770
01:12:58,400 --> 01:13:00,880
class method from the instance level but
1771
01:13:00,880 --> 01:13:02,960
that is just an option that exists i
1772
01:13:02,960 --> 01:13:05,520
know that it is very very confusing but
1773
01:13:05,520 --> 01:13:07,280
that is something you are rarely going
1774
01:13:07,280 --> 01:13:09,679
to see and like i said i never saw a
1775
01:13:09,679 --> 01:13:12,400
great reason to call a static method or
1776
01:13:12,400 --> 01:13:15,440
to call a class method from an instance
1777
01:13:15,440 --> 01:13:17,679
so my recommendation to not confuse you
1778
01:13:17,679 --> 01:13:20,159
is just not going with calling those
1779
01:13:20,159 --> 01:13:22,320
from the instance level alright so i
1780
01:13:22,320 --> 01:13:24,480
minimized the code that we wrote so far
1781
01:13:24,480 --> 01:13:27,040
in the class item now in order to start
1782
01:13:27,040 --> 01:13:28,880
solving the problems that we will solve
1783
01:13:28,880 --> 01:13:30,960
in this episode then i'm going to create
1784
01:13:30,960 --> 01:13:33,360
here two instances so i will say phone
1785
01:13:33,360 --> 01:13:34,239
one
1786
01:13:34,239 --> 01:13:37,040
is equal to an item and let's give it a
1787
01:13:37,040 --> 01:13:40,400
name like jsc phone v10
1788
01:13:40,400 --> 01:13:42,239
and then just
1789
01:13:42,239 --> 01:13:45,040
use a random price and quantity and i
1790
01:13:45,040 --> 01:13:47,679
will copy and paste this and use another
1791
01:13:47,679 --> 01:13:50,239
variable like phone 2 and i will
1792
01:13:50,239 --> 01:13:52,159
increase the version by 10 and let's say
1793
01:13:52,159 --> 01:13:54,640
that this price for the phone 2 should
1794
01:13:54,640 --> 01:13:57,280
be 700 all right so now that we have
1795
01:13:57,280 --> 01:13:59,679
created two instances of a phone pay
1796
01:13:59,679 --> 01:14:02,159
attention that those two items are
1797
01:14:02,159 --> 01:14:04,239
phones so we could think about some
1798
01:14:04,239 --> 01:14:07,120
attributes that could represent phones
1799
01:14:07,120 --> 01:14:09,679
in real life think about an attribute
1800
01:14:09,679 --> 01:14:11,840
like broken phones because we could have
1801
01:14:11,840 --> 01:14:14,239
some phones that could have been broken
1802
01:14:14,239 --> 01:14:16,800
and so we cannot really mark it as a
1803
01:14:16,800 --> 01:14:19,199
phone that we could really sell so this
1804
01:14:19,199 --> 01:14:21,600
means that we could go ahead and say
1805
01:14:21,600 --> 01:14:24,239
phone one dot broken phones
1806
01:14:24,239 --> 01:14:26,560
let's say that we have unfortunately one
1807
01:14:26,560 --> 01:14:28,960
broken phone on our hand right now so i
1808
01:14:28,960 --> 01:14:30,480
will go ahead and design the same
1809
01:14:30,480 --> 01:14:32,719
attribute for our second phone and now
1810
01:14:32,719 --> 01:14:35,120
that we have came up with this realistic
1811
01:14:35,120 --> 01:14:37,199
attribute then the next step that we
1812
01:14:37,199 --> 01:14:39,360
might think about could be creating a
1813
01:14:39,360 --> 01:14:41,440
method that will go ahead and calculate
1814
01:14:41,440 --> 01:14:43,760
the phones that are actually not broken
1815
01:14:43,760 --> 01:14:46,719
meaning subtracting the quantity by the
1816
01:14:46,719 --> 01:14:48,560
broken phones amount because this is
1817
01:14:48,560 --> 01:14:50,320
totally making sense and then we can
1818
01:14:50,320 --> 01:14:52,400
understand what are the phones that we
1819
01:14:52,400 --> 01:14:55,120
could go actually and sell them in the
1820
01:14:55,120 --> 01:14:57,440
future but we have a couple of problems
1821
01:14:57,440 --> 01:14:59,199
creating a method that will go ahead and
1822
01:14:59,199 --> 01:15:01,679
calculate such a thing because we cannot
1823
01:15:01,679 --> 01:15:04,080
really go ahead inside our item and do
1824
01:15:04,080 --> 01:15:06,400
this smooth enough because we don't
1825
01:15:06,400 --> 01:15:09,040
really have the broken phones attribute
1826
01:15:09,040 --> 01:15:12,159
assigned to self and we cannot actually
1827
01:15:12,159 --> 01:15:13,920
go ahead and create this method inside
1828
01:15:13,920 --> 01:15:16,640
this item class because this method is
1829
01:15:16,640 --> 01:15:18,640
not going to be useful for other
1830
01:15:18,640 --> 01:15:20,560
hundreds of items that you will go ahead
1831
01:15:20,560 --> 01:15:23,440
and create this just represent a phone
1832
01:15:23,440 --> 01:15:26,320
kind of item so in order to solve this
1833
01:15:26,320 --> 01:15:29,120
problem in terms of best practices in
1834
01:15:29,120 --> 01:15:31,120
object oriented programming then we
1835
01:15:31,120 --> 01:15:33,120
could go ahead and create a separated
1836
01:15:33,120 --> 01:15:34,920
class that will inherit the
1837
01:15:34,920 --> 01:15:37,760
functionalities that the item class
1838
01:15:37,760 --> 01:15:39,600
brings with it and that is exactly where
1839
01:15:39,600 --> 01:15:42,239
we could benefit from inheritance and we
1840
01:15:42,239 --> 01:15:43,920
could go ahead and create a separated
1841
01:15:43,920 --> 01:15:46,239
class that we could name phone and then
1842
01:15:46,239 --> 01:15:49,600
this phone class will inherit all the
1843
01:15:49,600 --> 01:15:52,719
methods and all the attributes that item
1844
01:15:52,719 --> 01:15:55,840
class has so let's go ahead and simulate
1845
01:15:55,840 --> 01:15:57,920
that so i'm not going to delete the
1846
01:15:57,920 --> 01:16:00,560
instances yet but i'm going to go ahead
1847
01:16:00,560 --> 01:16:03,520
here and create a class that i will name
1848
01:16:03,520 --> 01:16:06,239
it phone now pay attention that i will
1849
01:16:06,239 --> 01:16:08,560
not use a semicolon and i will use those
1850
01:16:08,560 --> 01:16:12,320
brackets and i will specify what class i
1851
01:16:12,320 --> 01:16:14,480
would like to inherit from so i will
1852
01:16:14,480 --> 01:16:18,239
inherit from item and then i will just
1853
01:16:18,239 --> 01:16:20,239
use a pass temporarily because i would
1854
01:16:20,239 --> 01:16:22,400
not like to use additional functionality
1855
01:16:22,400 --> 01:16:24,719
right now inside this class okay so now
1856
01:16:24,719 --> 01:16:26,719
that we have created this class then
1857
01:16:26,719 --> 01:16:28,880
let's go ahead and first execute our
1858
01:16:28,880 --> 01:16:31,440
program where at the first stage the
1859
01:16:31,440 --> 01:16:34,480
instances will be item instances
1860
01:16:34,480 --> 01:16:36,400
and this should not have any problems
1861
01:16:36,400 --> 01:16:38,640
because we know that we can create those
1862
01:16:38,640 --> 01:16:40,640
item instances and we will not receive
1863
01:16:40,640 --> 01:16:42,960
any errors but if we were to change
1864
01:16:42,960 --> 01:16:44,719
those to
1865
01:16:44,719 --> 01:16:46,480
phone
1866
01:16:46,480 --> 01:16:49,280
like that then we should still not
1867
01:16:49,280 --> 01:16:51,920
receive any arrows and that's just a
1868
01:16:51,920 --> 01:16:54,400
basic way that you could use inheritance
1869
01:16:54,400 --> 01:16:57,280
in order to represent different kinds of
1870
01:16:57,280 --> 01:16:59,760
objects when you want to do that now
1871
01:16:59,760 --> 01:17:01,600
this could also be applied to other
1872
01:17:01,600 --> 01:17:03,440
realistic programs that you want to come
1873
01:17:03,440 --> 01:17:06,080
up with them by your own but in my case
1874
01:17:06,080 --> 01:17:08,560
it totally makes sense to create some
1875
01:17:08,560 --> 01:17:11,280
classes where each class will represent
1876
01:17:11,280 --> 01:17:13,840
a kind of an item and then i could go
1877
01:17:13,840 --> 01:17:16,480
ahead and inherit from the item class
1878
01:17:16,480 --> 01:17:18,960
in each of the child classes that i will
1879
01:17:18,960 --> 01:17:20,800
go ahead and create in the future i
1880
01:17:20,800 --> 01:17:23,280
could also use another class for a kind
1881
01:17:23,280 --> 01:17:25,840
of item like laptop and then i could go
1882
01:17:25,840 --> 01:17:27,679
ahead and use a separated functionality
1883
01:17:27,679 --> 01:17:30,239
for that now when we talk about classes
1884
01:17:30,239 --> 01:17:32,880
that we inherit from then those are
1885
01:17:32,880 --> 01:17:35,360
considered to be called parent classes
1886
01:17:35,360 --> 01:17:38,400
and when we use multiple classes that
1887
01:17:38,400 --> 01:17:40,640
inherits from that parent class then
1888
01:17:40,640 --> 01:17:43,040
those are considered to be called child
1889
01:17:43,040 --> 01:17:45,760
classes so those are just terms that you
1890
01:17:45,760 --> 01:17:47,360
want to be familiar with when we talk
1891
01:17:47,360 --> 01:17:49,520
about object-oriented programming and
1892
01:17:49,520 --> 01:17:51,760
from here we will see more advanced
1893
01:17:51,760 --> 01:17:54,159
things that you can go ahead and do with
1894
01:17:54,159 --> 01:17:56,880
your child classes all right so now
1895
01:17:56,880 --> 01:17:58,400
let's go ahead and understand some more
1896
01:17:58,400 --> 01:18:00,719
advanced things about inheritance now
1897
01:18:00,719 --> 01:18:02,640
throughout this series we learned that
1898
01:18:02,640 --> 01:18:04,719
it is not a great idea to assign
1899
01:18:04,719 --> 01:18:07,920
attributes manually once we create those
1900
01:18:07,920 --> 01:18:10,159
instances and the better way to do that
1901
01:18:10,159 --> 01:18:12,320
is actually going ahead and creating our
1902
01:18:12,320 --> 01:18:15,360
constructor and pass the value that we
1903
01:18:15,360 --> 01:18:18,320
like to immediately in the instance
1904
01:18:18,320 --> 01:18:21,280
creation exactly like here so in order
1905
01:18:21,280 --> 01:18:23,600
to solve this then we gonna need to
1906
01:18:23,600 --> 01:18:25,280
figure out how we are going to do that
1907
01:18:25,280 --> 01:18:27,679
because creating the constructor inside
1908
01:18:27,679 --> 01:18:29,679
this phone class is going to be a little
1909
01:18:29,679 --> 01:18:31,840
bit tricky because we don't really want
1910
01:18:31,840 --> 01:18:34,320
to break the logic that the development
1911
01:18:34,320 --> 01:18:36,800
score in it brings with the parent class
1912
01:18:36,800 --> 01:18:38,719
but we'd also like to pass in an
1913
01:18:38,719 --> 01:18:41,520
additional attribute like broken phones
1914
01:18:41,520 --> 01:18:44,719
that we will go ahead and deal with that
1915
01:18:44,719 --> 01:18:46,640
attribute and assign it to the self
1916
01:18:46,640 --> 01:18:49,840
object exactly like we have done in the
1917
01:18:49,840 --> 01:18:52,719
second part of our series so in order to
1918
01:18:52,719 --> 01:18:55,120
keep the logic the same for this child
1919
01:18:55,120 --> 01:18:57,520
class and as well as receive some more
1920
01:18:57,520 --> 01:19:00,640
attributes then for now i'm going to go
1921
01:19:00,640 --> 01:19:03,760
ahead and copy the code in our
1922
01:19:03,760 --> 01:19:07,679
constructor and just paste this in
1923
01:19:07,679 --> 01:19:10,880
right inside our phone class and that's
1924
01:19:10,880 --> 01:19:14,000
making sense temporarily because we
1925
01:19:14,000 --> 01:19:16,800
receive the exact same parameters that
1926
01:19:16,800 --> 01:19:19,760
we should receive when we instantiate an
1927
01:19:19,760 --> 01:19:22,000
instance and we also have now the
1928
01:19:22,000 --> 01:19:25,520
control to receive some more parameters
1929
01:19:25,520 --> 01:19:27,679
like we want to do with the broken
1930
01:19:27,679 --> 01:19:31,199
phones so let's go ahead here and say
1931
01:19:31,199 --> 01:19:33,199
broken
1932
01:19:33,199 --> 01:19:35,679
so i will just scroll here and i will
1933
01:19:35,679 --> 01:19:39,040
say broken phones is equal to zero let's
1934
01:19:39,040 --> 01:19:41,600
also receive a default value for that
1935
01:19:41,600 --> 01:19:43,600
and let's go ahead and type in a
1936
01:19:43,600 --> 01:19:46,480
validation for the broken phones so i
1937
01:19:46,480 --> 01:19:48,640
will allow myself to just copy that and
1938
01:19:48,640 --> 01:19:51,840
paste this in and we'll use a third
1939
01:19:51,840 --> 01:19:54,400
quantity i mean broken phones is greater
1940
01:19:54,400 --> 01:19:57,040
than or equal to zero and i will change
1941
01:19:57,040 --> 01:19:58,400
this to
1942
01:19:58,400 --> 01:20:01,440
broken phone
1943
01:20:01,920 --> 01:20:04,080
like that actually broken phones and
1944
01:20:04,080 --> 01:20:05,440
this should
1945
01:20:05,440 --> 01:20:07,679
be exactly like we have done with the
1946
01:20:07,679 --> 01:20:09,920
quantity and now let's go ahead to the
1947
01:20:09,920 --> 01:20:12,800
section of assign to self object and we
1948
01:20:12,800 --> 01:20:15,520
can use self.broken
1949
01:20:15,520 --> 01:20:18,960
phones is equal to broken phones like
1950
01:20:18,960 --> 01:20:19,760
that
1951
01:20:19,760 --> 01:20:21,679
and you can see that here we have
1952
01:20:21,679 --> 01:20:24,159
actions to execute now it could have
1953
01:20:24,159 --> 01:20:26,400
been nicer if we could also create a
1954
01:20:26,400 --> 01:20:29,840
class attribute for the phone class and
1955
01:20:29,840 --> 01:20:31,600
that will mean that we could go ahead
1956
01:20:31,600 --> 01:20:34,719
here and say all is equal to an empty
1957
01:20:34,719 --> 01:20:35,600
list
1958
01:20:35,600 --> 01:20:38,560
and then we could go ahead and
1959
01:20:38,560 --> 01:20:42,480
use a phone dot all dot append like that
1960
01:20:42,480 --> 01:20:46,480
and now if i was to go ahead and run
1961
01:20:46,480 --> 01:20:48,480
this program then you can see that i
1962
01:20:48,480 --> 01:20:50,960
will not receive any arrows now to check
1963
01:20:50,960 --> 01:20:53,679
that this works then i'm also going to
1964
01:20:53,679 --> 01:20:56,800
pass in here one and i'm going to do the
1965
01:20:56,800 --> 01:20:59,120
same here as well and i'm going to
1966
01:20:59,120 --> 01:21:01,120
remove those all right i'm going to
1967
01:21:01,120 --> 01:21:03,440
remove the hard-coded attributes and the
1968
01:21:03,440 --> 01:21:06,080
program still works now i'd also like to
1969
01:21:06,080 --> 01:21:08,159
test this by applying one of the methods
1970
01:21:08,159 --> 01:21:10,719
that we have wrote so far and that will
1971
01:21:10,719 --> 01:21:12,320
be obviously a method that i'd like to
1972
01:21:12,320 --> 01:21:14,480
use from the parent class because we
1973
01:21:14,480 --> 01:21:17,120
inherit those methods so i can go ahead
1974
01:21:17,120 --> 01:21:18,760
and use
1975
01:21:18,760 --> 01:21:20,719
phoneone dot
1976
01:21:20,719 --> 01:21:23,920
calculate total price and it makes sense
1977
01:21:23,920 --> 01:21:25,679
to print this so i will go ahead and
1978
01:21:25,679 --> 01:21:28,639
print that and you can see that print
1979
01:21:28,639 --> 01:21:31,440
phone one dot calculate total price and
1980
01:21:31,440 --> 01:21:33,360
now if i was to run that then you can
1981
01:21:33,360 --> 01:21:35,840
see that i receive a result so this
1982
01:21:35,840 --> 01:21:38,159
means that i don't have any errors now
1983
01:21:38,159 --> 01:21:40,080
i'm not sure if you paid attention to
1984
01:21:40,080 --> 01:21:42,880
this but if i was to scroll up a bit
1985
01:21:42,880 --> 01:21:44,080
then you're gonna see that the
1986
01:21:44,080 --> 01:21:46,000
constructor in the chat class is
1987
01:21:46,000 --> 01:21:48,480
complaining about something and let's
1988
01:21:48,480 --> 01:21:50,639
hover the mouse and see what is the
1989
01:21:50,639 --> 01:21:52,800
warning now you can see that it says to
1990
01:21:52,800 --> 01:21:55,280
us call to double underscore init of
1991
01:21:55,280 --> 01:21:58,719
super class is missed and what that
1992
01:21:58,719 --> 01:22:01,040
means it means that when we initialize
1993
01:22:01,040 --> 01:22:03,199
the double underscore init method inside
1994
01:22:03,199 --> 01:22:05,840
the child class then python expects for
1995
01:22:05,840 --> 01:22:08,239
some function to be called intentionally
1996
01:22:08,239 --> 01:22:11,040
now this function is named super and
1997
01:22:11,040 --> 01:22:13,199
what super allows us to do it allows us
1998
01:22:13,199 --> 01:22:15,120
to have full access to all the
1999
01:22:15,120 --> 01:22:17,360
attributes of the parent class and by
2000
01:22:17,360 --> 01:22:20,000
using the super function we don't really
2001
01:22:20,000 --> 01:22:22,320
need to hard code in the attribute
2002
01:22:22,320 --> 01:22:24,400
assignment like we have done with the
2003
01:22:24,400 --> 01:22:26,880
name price and quantity and as well as
2004
01:22:26,880 --> 01:22:28,800
for the other validations that we have
2005
01:22:28,800 --> 01:22:32,000
executed every time that we want to come
2006
01:22:32,000 --> 01:22:34,880
up with a child class now imagine how
2007
01:22:34,880 --> 01:22:37,760
hard that is going to be if for each of
2008
01:22:37,760 --> 01:22:39,679
the child classes that we will create in
2009
01:22:39,679 --> 01:22:42,080
the future we will have to go through
2010
01:22:42,080 --> 01:22:44,719
copying and pasting a third price and
2011
01:22:44,719 --> 01:22:47,040
quantity and as well as doing the
2012
01:22:47,040 --> 01:22:50,080
assigned to self objecting in those
2013
01:22:50,080 --> 01:22:52,320
three lines that is going to be a lot of
2014
01:22:52,320 --> 01:22:55,360
duplication of code now to save us that
2015
01:22:55,360 --> 01:22:58,159
time that is exactly why we need to use
2016
01:22:58,159 --> 01:23:00,560
the super function the super function
2017
01:23:00,560 --> 01:23:02,880
will allow us to have the attributes
2018
01:23:02,880 --> 01:23:05,040
access from the parent classes and
2019
01:23:05,040 --> 01:23:08,239
therefore we will be able to fully
2020
01:23:08,239 --> 01:23:10,080
implement the best practices in
2021
01:23:10,080 --> 01:23:11,840
inheritance when it comes to
2022
01:23:11,840 --> 01:23:14,560
object-oriented programs now again this
2023
01:23:14,560 --> 01:23:17,280
program works because we assign the
2024
01:23:17,280 --> 01:23:20,000
attributes of name price in quantity for
2025
01:23:20,000 --> 01:23:23,600
the self object in the child class but
2026
01:23:23,600 --> 01:23:25,679
if i was to remove
2027
01:23:25,679 --> 01:23:26,880
those
2028
01:23:26,880 --> 01:23:29,440
three lines and as well as those two
2029
01:23:29,440 --> 01:23:31,440
lines now those lines are happen to be
2030
01:23:31,440 --> 01:23:34,080
the lines that i have copied and pasted
2031
01:23:34,080 --> 01:23:36,560
and try to run this program then you can
2032
01:23:36,560 --> 01:23:38,800
see that we receive attribute error
2033
01:23:38,800 --> 01:23:41,600
phone object has no attribute price and
2034
01:23:41,600 --> 01:23:43,520
pay attention from what line it comes
2035
01:23:43,520 --> 01:23:46,400
from it comes from line 21
2036
01:23:46,400 --> 01:23:48,400
from the item class because it thinks
2037
01:23:48,400 --> 01:23:50,719
that it has the attribute of price but
2038
01:23:50,719 --> 01:23:53,360
we never have the price attribute in the
2039
01:23:53,360 --> 01:23:55,520
phone level because we just deleted the
2040
01:23:55,520 --> 01:23:58,639
self.price is equal to price and that's
2041
01:23:58,639 --> 01:23:59,440
why
2042
01:23:59,440 --> 01:24:01,600
now we have some problems and we are
2043
01:24:01,600 --> 01:24:03,600
going to replace all the lines that we
2044
01:24:03,600 --> 01:24:05,760
have deleted with the following thing
2045
01:24:05,760 --> 01:24:08,080
that i'm going to just execute now so
2046
01:24:08,080 --> 01:24:11,280
i'm going to go to the first line of our
2047
01:24:11,280 --> 01:24:15,199
constructor and i'm going to say call
2048
01:24:15,199 --> 01:24:16,719
to super
2049
01:24:16,719 --> 01:24:18,159
function
2050
01:24:18,159 --> 01:24:20,000
to have access
2051
01:24:20,000 --> 01:24:23,040
to all attributes
2052
01:24:23,040 --> 01:24:26,239
slash methods and then i'm going to say
2053
01:24:26,239 --> 01:24:27,199
super
2054
01:24:27,199 --> 01:24:28,840
then i'm going to open up and close
2055
01:24:28,840 --> 01:24:31,040
parentheses and then i'm going to use
2056
01:24:31,040 --> 01:24:33,840
the double underscore init method like
2057
01:24:33,840 --> 01:24:35,679
that now you can see that the second
2058
01:24:35,679 --> 01:24:37,600
that i have completed this then there
2059
01:24:37,600 --> 01:24:38,880
are no more warnings about the
2060
01:24:38,880 --> 01:24:40,960
constructor in this child class and you
2061
01:24:40,960 --> 01:24:42,960
can also see that this double underscore
2062
01:24:42,960 --> 01:24:45,840
init method expects for some special
2063
01:24:45,840 --> 01:24:48,080
arguments now those special arguments
2064
01:24:48,080 --> 01:24:50,239
obviously coming from the item class
2065
01:24:50,239 --> 01:24:53,440
that we inherit from so if i was to pass
2066
01:24:53,440 --> 01:24:54,800
in here
2067
01:24:54,800 --> 01:24:55,920
name
2068
01:24:55,920 --> 01:24:57,440
and also
2069
01:24:57,440 --> 01:25:01,040
price and also quantity then this should
2070
01:25:01,040 --> 01:25:04,320
be fine now you can also ask yourself
2071
01:25:04,320 --> 01:25:06,800
isn't it a duplication of code the fact
2072
01:25:06,800 --> 01:25:08,880
that we also copied and pasted the
2073
01:25:08,880 --> 01:25:11,199
parameters that we receive in the child
2074
01:25:11,199 --> 01:25:13,760
class and yeah that is a perfect
2075
01:25:13,760 --> 01:25:15,840
question that is something that could be
2076
01:25:15,840 --> 01:25:18,000
solved by something more advanced if you
2077
01:25:18,000 --> 01:25:20,480
heard about keyword arguments that is
2078
01:25:20,480 --> 01:25:22,480
something that we can solve it with that
2079
01:25:22,480 --> 01:25:24,320
way and then we will not have to
2080
01:25:24,320 --> 01:25:26,639
duplicate the parameters that we receive
2081
01:25:26,639 --> 01:25:28,400
for the constructor but that is not
2082
01:25:28,400 --> 01:25:29,920
something that i'm going to show for
2083
01:25:29,920 --> 01:25:32,400
that stage i'm going to stick with it
2084
01:25:32,400 --> 01:25:34,719
and i'm just going to leave it as it is
2085
01:25:34,719 --> 01:25:35,520
now
2086
01:25:35,520 --> 01:25:38,159
calling the super function and as well
2087
01:25:38,159 --> 01:25:40,639
as the init method right after it should
2088
01:25:40,639 --> 01:25:43,120
be responsible to have the same behavior
2089
01:25:43,120 --> 01:25:45,280
like we had previously so we should
2090
01:25:45,280 --> 01:25:47,120
still see 2
2091
01:25:47,120 --> 01:25:50,159
500 for this print line and we should
2092
01:25:50,159 --> 01:25:52,080
not see any errors and if i was to run
2093
01:25:52,080 --> 01:25:54,320
the program then you can see that we
2094
01:25:54,320 --> 01:25:57,199
receive the expected result so that way
2095
01:25:57,199 --> 01:25:58,960
we implement the best practices of
2096
01:25:58,960 --> 01:26:01,280
object-oriented programming for each
2097
01:26:01,280 --> 01:26:03,760
child class that we use a separated
2098
01:26:03,760 --> 01:26:06,480
constructor we also gonna need to call
2099
01:26:06,480 --> 01:26:09,199
the super function in order to have
2100
01:26:09,199 --> 01:26:10,639
fully access
2101
01:26:10,639 --> 01:26:13,199
for all the attributes and methods that
2102
01:26:13,199 --> 01:26:15,520
are coming from the class that we
2103
01:26:15,520 --> 01:26:17,600
inherit from all right so i minimized
2104
01:26:17,600 --> 01:26:20,480
the code for our classes and i also left
2105
01:26:20,480 --> 01:26:23,199
with one instance of phone here now i
2106
01:26:23,199 --> 01:26:24,960
want to show you the results of the
2107
01:26:24,960 --> 01:26:27,520
following things so i will say print and
2108
01:26:27,520 --> 01:26:31,040
i will see what is the list of all in
2109
01:26:31,040 --> 01:26:33,440
the item class is going to bring us back
2110
01:26:33,440 --> 01:26:35,840
so i'm going to say
2111
01:26:35,840 --> 01:26:38,639
and then i'm also going to say phone.all
2112
01:26:38,639 --> 01:26:40,239
if you remember we implemented this
2113
01:26:40,239 --> 01:26:43,040
class attributes as well here so i will
2114
01:26:43,040 --> 01:26:45,679
minimize the code back and then i will
2115
01:26:45,679 --> 01:26:47,679
run our program now you can see
2116
01:26:47,679 --> 01:26:51,040
something very weird in here we see item
2117
01:26:51,040 --> 01:26:52,880
and then we basically see the result of
2118
01:26:52,880 --> 01:26:55,760
the repr method that comes from the item
2119
01:26:55,760 --> 01:26:58,159
class now the reason that this happens
2120
01:26:58,159 --> 01:27:00,480
because we never implemented in our epr
2121
01:27:00,480 --> 01:27:03,199
method inside the phone class so that's
2122
01:27:03,199 --> 01:27:06,880
why we see this ungeneric result of item
2123
01:27:06,880 --> 01:27:09,280
now you can also pay attention that we
2124
01:27:09,280 --> 01:27:11,440
only create an instance of the phone
2125
01:27:11,440 --> 01:27:14,960
class so that's not so good that we see
2126
01:27:14,960 --> 01:27:18,080
item in those outputs so what we could
2127
01:27:18,080 --> 01:27:20,320
use instead of hard coding in the name
2128
01:27:20,320 --> 01:27:23,120
of the class in the repr method inside
2129
01:27:23,120 --> 01:27:26,080
the item class then we could access to
2130
01:27:26,080 --> 01:27:28,719
the name of the class generically now if
2131
01:27:28,719 --> 01:27:31,760
i was to replace this with some special
2132
01:27:31,760 --> 01:27:33,920
magic attribute that will be responsible
2133
01:27:33,920 --> 01:27:36,080
to give me the name of the class then
2134
01:27:36,080 --> 01:27:38,000
this will be perfect so i'm going to
2135
01:27:38,000 --> 01:27:40,719
delete that and i'm going to use curly
2136
01:27:40,719 --> 01:27:43,199
brackets and i'm going to say self
2137
01:27:43,199 --> 01:27:46,400
dot double underscore class
2138
01:27:46,400 --> 01:27:50,000
dot double underscore name so that is a
2139
01:27:50,000 --> 01:27:52,159
generic way to access to the name of the
2140
01:27:52,159 --> 01:27:55,120
class from the instance and by doing
2141
01:27:55,120 --> 01:27:58,000
this then besides receiving item hard
2142
01:27:58,000 --> 01:28:00,400
coded string then i should receive the
2143
01:28:00,400 --> 01:28:02,719
name of the class that i initialized
2144
01:28:02,719 --> 01:28:04,320
from the very beginning so this should
2145
01:28:04,320 --> 01:28:05,040
be
2146
01:28:05,040 --> 01:28:07,280
phone because that is the only single
2147
01:28:07,280 --> 01:28:09,120
instance that i have right now and you
2148
01:28:09,120 --> 01:28:10,960
can see that this is exactly the result
2149
01:28:10,960 --> 01:28:12,880
that i'm receiving back so that is
2150
01:28:12,880 --> 01:28:15,840
perfect now i said earlier that by using
2151
01:28:15,840 --> 01:28:18,639
the super function then we basically
2152
01:28:18,639 --> 01:28:20,800
have access to all the attributes and
2153
01:28:20,800 --> 01:28:22,719
the methods that are coming from the
2154
01:28:22,719 --> 01:28:25,120
class that we inherit from so what that
2155
01:28:25,120 --> 01:28:27,120
means it means that we will also have
2156
01:28:27,120 --> 01:28:30,080
the access to the class attribute of all
2157
01:28:30,080 --> 01:28:33,040
that is inside the item class and i'm
2158
01:28:33,040 --> 01:28:34,400
talking about
2159
01:28:34,400 --> 01:28:37,199
that attribute all right now to show you
2160
01:28:37,199 --> 01:28:39,679
that then i'm going to open back the
2161
01:28:39,679 --> 01:28:42,400
code from the phone class and i'm going
2162
01:28:42,400 --> 01:28:45,600
to remove the all attribute and i'm just
2163
01:28:45,600 --> 01:28:47,840
going to do that right now and i'm also
2164
01:28:47,840 --> 01:28:50,080
going to delete the actions to execute
2165
01:28:50,080 --> 01:28:53,040
where i use phone dot all dot append
2166
01:28:53,040 --> 01:28:55,280
because we no longer having the old
2167
01:28:55,280 --> 01:28:58,000
attribute in the phone class and if i
2168
01:28:58,000 --> 01:29:01,280
was to remove those and execute our
2169
01:29:01,280 --> 01:29:03,360
program now then you can see that i
2170
01:29:03,360 --> 01:29:05,920
still receive the same result so that is
2171
01:29:05,920 --> 01:29:08,800
a great idea removing the old attribute
2172
01:29:08,800 --> 01:29:11,520
in the child class level it is a great
2173
01:29:11,520 --> 01:29:14,400
idea to only use the old attribute in
2174
01:29:14,400 --> 01:29:16,639
the parent class because by using the
2175
01:29:16,639 --> 01:29:18,639
super function in the child class we
2176
01:29:18,639 --> 01:29:21,280
will have access to the old attribute so
2177
01:29:21,280 --> 01:29:23,520
this means that if one day would like to
2178
01:29:23,520 --> 01:29:26,480
have access to all the items instances
2179
01:29:26,480 --> 01:29:28,960
that have been initialized including the
2180
01:29:28,960 --> 01:29:31,520
child classes then accessing them from
2181
01:29:31,520 --> 01:29:34,480
item.all should also be enough now you
2182
01:29:34,480 --> 01:29:36,719
might be confused how this line is
2183
01:29:36,719 --> 01:29:39,360
responsible to add this instance inside
2184
01:29:39,360 --> 01:29:42,080
the all attribute that is happen to be a
2185
01:29:42,080 --> 01:29:44,880
list and that's happening because by
2186
01:29:44,880 --> 01:29:47,520
using the super function and as well as
2187
01:29:47,520 --> 01:29:50,880
the init then we basically call the init
2188
01:29:50,880 --> 01:29:53,760
method inside the parent class now in
2189
01:29:53,760 --> 01:29:55,840
the latest line inside this method we
2190
01:29:55,840 --> 01:29:58,159
also use item.old.append
2191
01:29:58,159 --> 01:29:59,920
which is also going to be accessible
2192
01:29:59,920 --> 01:30:02,560
from the phone class so that's why
2193
01:30:02,560 --> 01:30:04,080
calling the all
2194
01:30:04,080 --> 01:30:07,199
class attribute from the item class is a
2195
01:30:07,199 --> 01:30:09,360
better idea because it will give us the
2196
01:30:09,360 --> 01:30:12,239
complete picture okay so before diving
2197
01:30:12,239 --> 01:30:14,800
into the topic of that episode then
2198
01:30:14,800 --> 01:30:16,639
we're gonna need to do some code
2199
01:30:16,639 --> 01:30:18,560
organization in here because as you can
2200
01:30:18,560 --> 01:30:20,880
see for each of the child classes that
2201
01:30:20,880 --> 01:30:22,239
we will go ahead and create in the
2202
01:30:22,239 --> 01:30:24,480
future to extend this project then we're
2203
01:30:24,480 --> 01:30:26,560
going to need to do this in the main.py
2204
01:30:26,560 --> 01:30:28,800
file because that was the only single
2205
01:30:28,800 --> 01:30:30,960
file that we were working with and now
2206
01:30:30,960 --> 01:30:33,679
that our project grows we need to start
2207
01:30:33,679 --> 01:30:35,840
working with multiple files so that's
2208
01:30:35,840 --> 01:30:38,159
why maybe working with a file that will
2209
01:30:38,159 --> 01:30:40,239
represent the class of item and working
2210
01:30:40,239 --> 01:30:42,400
with a separate file that will represent
2211
01:30:42,400 --> 01:30:44,800
the phone child class will be a better
2212
01:30:44,800 --> 01:30:47,760
idea so we will have the main.py file
2213
01:30:47,760 --> 01:30:51,199
dedicated for only creating instances of
2214
01:30:51,199 --> 01:30:53,920
those classes so let's get started with
2215
01:30:53,920 --> 01:30:55,600
this so i'm going to go to the project
2216
01:30:55,600 --> 01:30:58,560
directory and create two python files
2217
01:30:58,560 --> 01:31:02,080
first one we will named item.py
2218
01:31:02,080 --> 01:31:05,840
the other one should be named phone.py
2219
01:31:05,840 --> 01:31:07,920
and i'm going to take the code from our
2220
01:31:07,920 --> 01:31:09,360
item class
2221
01:31:09,360 --> 01:31:13,440
and i'm just going to grab everything
2222
01:31:13,600 --> 01:31:16,000
like the following and i'm going to cut
2223
01:31:16,000 --> 01:31:19,199
this and then i'm going to paste this in
2224
01:31:19,199 --> 01:31:21,760
inside of that now pay attention that i
2225
01:31:21,760 --> 01:31:24,560
use the csv library so that's actually
2226
01:31:24,560 --> 01:31:26,639
the location that i need this library so
2227
01:31:26,639 --> 01:31:28,080
i'm going to
2228
01:31:28,080 --> 01:31:30,560
just copy the import line and that
2229
01:31:30,560 --> 01:31:32,800
should be good enough now i'm going to
2230
01:31:32,800 --> 01:31:35,679
do the same process for the
2231
01:31:35,679 --> 01:31:38,320
phone.py and i'm going to be copying
2232
01:31:38,320 --> 01:31:41,280
this into the phone.py file as well but
2233
01:31:41,280 --> 01:31:44,480
now this file needs to import the item
2234
01:31:44,480 --> 01:31:46,239
class because as you can see we got an
2235
01:31:46,239 --> 01:31:50,080
error here so we should say from item
2236
01:31:50,080 --> 01:31:52,719
import item like the following and the
2237
01:31:52,719 --> 01:31:54,960
errors should be gone and then in the
2238
01:31:54,960 --> 01:31:57,920
main.py file we can basically use this
2239
01:31:57,920 --> 01:32:00,480
file to only instantiate instances
2240
01:32:00,480 --> 01:32:02,960
meaning creating data that will
2241
01:32:02,960 --> 01:32:05,120
represent something to python so this
2242
01:32:05,120 --> 01:32:06,960
means that we can go ahead and import
2243
01:32:06,960 --> 01:32:09,360
the class from the item file
2244
01:32:09,360 --> 01:32:11,440
we can do the same
2245
01:32:11,440 --> 01:32:12,960
from the
2246
01:32:12,960 --> 01:32:15,199
phone file and then we can go ahead and
2247
01:32:15,199 --> 01:32:17,280
do the stuff that we used to do so we
2248
01:32:17,280 --> 01:32:18,960
can say item dot
2249
01:32:18,960 --> 01:32:22,080
install sheet from csv and to verify
2250
01:32:22,080 --> 01:32:26,000
that this works we can also say print
2251
01:32:26,000 --> 01:32:28,320
item dot all like that
2252
01:32:28,320 --> 01:32:30,400
and if we want to run this file now to
2253
01:32:30,400 --> 01:32:32,480
see that this works then we can do that
2254
01:32:32,480 --> 01:32:34,000
and you can see that everything works
2255
01:32:34,000 --> 01:32:36,560
just as expected now just a quick side
2256
01:32:36,560 --> 01:32:38,480
note i'm not going to rely too much on
2257
01:32:38,480 --> 01:32:40,400
the child class that we have created in
2258
01:32:40,400 --> 01:32:42,800
the latest episode to show the problems
2259
01:32:42,800 --> 01:32:44,080
that we're going to solve in that
2260
01:32:44,080 --> 01:32:46,000
episode i'm going to rely
2261
01:32:46,000 --> 01:32:49,120
more on the item class so that it will
2262
01:32:49,120 --> 01:32:50,960
be easier to follow and we will not
2263
01:32:50,960 --> 01:32:53,440
complex things too much now that doesn't
2264
01:32:53,440 --> 01:32:55,840
mean that i do not recommend using child
2265
01:32:55,840 --> 01:32:57,679
classes or something like that but it
2266
01:32:57,679 --> 01:32:59,840
will be just easier to show you the
2267
01:32:59,840 --> 01:33:01,840
cases that i'm going to show in the
2268
01:33:01,840 --> 01:33:04,480
parent class so that's why for example i
2269
01:33:04,480 --> 01:33:07,199
deleted temporarily the import line of
2270
01:33:07,199 --> 01:33:10,159
the phone class and i just came up with
2271
01:33:10,159 --> 01:33:13,040
a random item instance that name is my
2272
01:33:13,040 --> 01:33:15,120
item and the price happened to be that
2273
01:33:15,120 --> 01:33:16,800
number i did not specify quantity
2274
01:33:16,800 --> 01:33:19,040
because we have a default value and now
2275
01:33:19,040 --> 01:33:20,880
after this line you can see that i
2276
01:33:20,880 --> 01:33:24,080
override this attribute by the string of
2277
01:33:24,080 --> 01:33:26,560
other item now the expected result is
2278
01:33:26,560 --> 01:33:28,800
not going to surprise anyone because we
2279
01:33:28,800 --> 01:33:30,719
see at the right time when we print this
2280
01:33:30,719 --> 01:33:32,719
attribute but we
2281
01:33:32,719 --> 01:33:35,199
might want to ask ourselves is that a
2282
01:33:35,199 --> 01:33:37,920
behavior that we always want what if we
2283
01:33:37,920 --> 01:33:40,639
want to restrict our users to change the
2284
01:33:40,639 --> 01:33:43,520
attribute of name once the name has been
2285
01:33:43,520 --> 01:33:45,840
set up in the initialization meaning in
2286
01:33:45,840 --> 01:33:48,320
that line well that's something that we
2287
01:33:48,320 --> 01:33:50,880
might want to achieve for critical
2288
01:33:50,880 --> 01:33:53,040
attributes like the name of your
2289
01:33:53,040 --> 01:33:55,120
instances and in our case
2290
01:33:55,120 --> 01:33:58,000
the name of our item so what we could do
2291
01:33:58,000 --> 01:34:00,000
we could actually go ahead and create
2292
01:34:00,000 --> 01:34:02,960
read-only so-called attributes meaning
2293
01:34:02,960 --> 01:34:06,400
that we have only one opportunity to set
2294
01:34:06,400 --> 01:34:09,440
the name of our item and then we cannot
2295
01:34:09,440 --> 01:34:11,920
touch the value of that anymore so what
2296
01:34:11,920 --> 01:34:13,760
that means it means that we can set up
2297
01:34:13,760 --> 01:34:16,560
this in the initialization and we should
2298
01:34:16,560 --> 01:34:18,800
have errors if we try to override the
2299
01:34:18,800 --> 01:34:21,840
value of that now that's also known as
2300
01:34:21,840 --> 01:34:24,719
encapsulation when we talk about the
2301
01:34:24,719 --> 01:34:26,400
principles of object-oriented
2302
01:34:26,400 --> 01:34:28,880
programming which i will be focusing
2303
01:34:28,880 --> 01:34:31,440
more on the future episodes but now
2304
01:34:31,440 --> 01:34:33,199
let's go ahead and see how we can come
2305
01:34:33,199 --> 01:34:35,760
up with read-only attributes how we can
2306
01:34:35,760 --> 01:34:38,400
restrict our users to override the
2307
01:34:38,400 --> 01:34:41,119
attributes after the initialization of
2308
01:34:41,119 --> 01:34:42,800
our instances
2309
01:34:42,800 --> 01:34:44,400
okay so on the left side we have the
2310
01:34:44,400 --> 01:34:46,800
main.py file and on the right side we
2311
01:34:46,800 --> 01:34:48,960
have the item.py file which we are going
2312
01:34:48,960 --> 01:34:51,199
to work on and inside the class i'm
2313
01:34:51,199 --> 01:34:53,679
going to create our first read-only
2314
01:34:53,679 --> 01:34:55,920
attribute now the way that you can start
2315
01:34:55,920 --> 01:34:59,119
doing this is by first using a decorator
2316
01:34:59,119 --> 01:35:00,560
and if you remember from the previous
2317
01:35:00,560 --> 01:35:02,880
episodes decorators are like functions
2318
01:35:02,880 --> 01:35:04,960
that you can pre-execute before another
2319
01:35:04,960 --> 01:35:07,920
function so i could go ahead and use the
2320
01:35:07,920 --> 01:35:12,320
property decorator and then go ahead and
2321
01:35:12,320 --> 01:35:14,639
create a function and here's the exact
2322
01:35:14,639 --> 01:35:17,600
location that i could set up the name of
2323
01:35:17,600 --> 01:35:20,880
our read-only attribute so for testing
2324
01:35:20,880 --> 01:35:22,960
reasons let's go ahead and call this
2325
01:35:22,960 --> 01:35:25,520
read-only name something in that kind
2326
01:35:25,520 --> 01:35:27,679
all right and then i will open up and
2327
01:35:27,679 --> 01:35:29,679
close parentheses and this will
2328
01:35:29,679 --> 01:35:31,520
obviously receive self because it's
2329
01:35:31,520 --> 01:35:33,280
going to be belong to each of the
2330
01:35:33,280 --> 01:35:36,400
instances and now for testing purposes
2331
01:35:36,400 --> 01:35:38,239
let's only go ahead and return a random
2332
01:35:38,239 --> 01:35:39,840
string like
2333
01:35:39,840 --> 01:35:42,800
a three times all right and then now
2334
01:35:42,800 --> 01:35:45,199
that we have done this i can go to our
2335
01:35:45,199 --> 01:35:48,400
main.py file and try to access this
2336
01:35:48,400 --> 01:35:50,320
property now pay attention that i'm
2337
01:35:50,320 --> 01:35:53,280
going to call those properties and not
2338
01:35:53,280 --> 01:35:56,159
attributes so i'm going to go here and
2339
01:35:56,159 --> 01:35:57,760
i'm going to try to
2340
01:35:57,760 --> 01:36:00,639
print item1 dot
2341
01:36:00,639 --> 01:36:03,280
name and now that i have wrote name pay
2342
01:36:03,280 --> 01:36:05,040
attention to the differences in this
2343
01:36:05,040 --> 01:36:08,000
drop down for read only name we receive
2344
01:36:08,000 --> 01:36:10,000
a totally different icon here on the
2345
01:36:10,000 --> 01:36:12,880
left side which stands for a property
2346
01:36:12,880 --> 01:36:15,440
where in here we see the f letter which
2347
01:36:15,440 --> 01:36:18,000
stands for a regular field so if i was
2348
01:36:18,000 --> 01:36:21,199
to try to print that and run our program
2349
01:36:21,199 --> 01:36:22,880
then obviously we will receive the
2350
01:36:22,880 --> 01:36:26,239
expected result but if i was to try to
2351
01:36:26,239 --> 01:36:29,679
set a new value for the read-only name
2352
01:36:29,679 --> 01:36:31,199
say that we want to change this to
2353
01:36:31,199 --> 01:36:32,960
something like that then you're gonna
2354
01:36:32,960 --> 01:36:34,880
see that pycharm is going to complain
2355
01:36:34,880 --> 01:36:37,440
about this and even if we try to execute
2356
01:36:37,440 --> 01:36:39,280
that then we will end up with an
2357
01:36:39,280 --> 01:36:41,760
exception that says attribute error
2358
01:36:41,760 --> 01:36:44,800
can't set attribute so that is how
2359
01:36:44,800 --> 01:36:47,119
read-only attributes so-called are
2360
01:36:47,119 --> 01:36:49,600
working in python you can create those
2361
01:36:49,600 --> 01:36:52,400
by using a property decorator before
2362
01:36:52,400 --> 01:36:55,040
your functions and return whatever value
2363
01:36:55,040 --> 01:36:57,600
you would like to return now the biggest
2364
01:36:57,600 --> 01:37:00,560
challenge here is going to be converting
2365
01:37:00,560 --> 01:37:03,920
the name attribute that we actually have
2366
01:37:03,920 --> 01:37:07,440
which is happen to be exactly here into
2367
01:37:07,440 --> 01:37:09,920
being a read-only attribute and that is
2368
01:37:09,920 --> 01:37:11,840
going to be a little bit challenging but
2369
01:37:11,840 --> 01:37:14,320
let's go ahead and start working on that
2370
01:37:14,320 --> 01:37:16,159
so first things first i'm going to
2371
01:37:16,159 --> 01:37:18,159
delete those three lines because we are
2372
01:37:18,159 --> 01:37:20,320
not going to use this property anymore
2373
01:37:20,320 --> 01:37:23,199
and i'm going to scroll up a bit and
2374
01:37:23,199 --> 01:37:26,800
work underneath this constructor here so
2375
01:37:26,800 --> 01:37:29,760
you might think that converting the name
2376
01:37:29,760 --> 01:37:31,920
attribute into being read only meaning a
2377
01:37:31,920 --> 01:37:34,639
property is as easy as doing something
2378
01:37:34,639 --> 01:37:35,600
like
2379
01:37:35,600 --> 01:37:37,840
first using the property decorator and
2380
01:37:37,840 --> 01:37:40,320
then go ahead and say def name
2381
01:37:40,320 --> 01:37:42,880
then receive self as the parameter and
2382
01:37:42,880 --> 01:37:45,440
then use something like return self dot
2383
01:37:45,440 --> 01:37:47,199
name because we already have the self
2384
01:37:47,199 --> 01:37:50,239
type name assigned to the self object
2385
01:37:50,239 --> 01:37:52,480
but actually doing something like this
2386
01:37:52,480 --> 01:37:55,119
is like saying to that class hey from
2387
01:37:55,119 --> 01:37:58,000
now on you are going to have a name
2388
01:37:58,000 --> 01:38:01,360
attribute that is going to be read only
2389
01:38:01,360 --> 01:38:03,840
and that is straightforward the effect
2390
01:38:03,840 --> 01:38:05,920
of the property decorator so i'm going
2391
01:38:05,920 --> 01:38:07,760
to leave a comment here that is going to
2392
01:38:07,760 --> 01:38:09,679
look like the following but if you
2393
01:38:09,679 --> 01:38:10,719
remember
2394
01:38:10,719 --> 01:38:14,960
we try to set the self.name into a new
2395
01:38:14,960 --> 01:38:19,040
value inside our constructor so you can
2396
01:38:19,040 --> 01:38:22,639
see that this action is illegal because
2397
01:38:22,639 --> 01:38:25,679
we have a read only property here so
2398
01:38:25,679 --> 01:38:27,840
when you go ahead and create a property
2399
01:38:27,840 --> 01:38:30,960
with the name of basically name then you
2400
01:38:30,960 --> 01:38:33,920
are no more allowed to set this
2401
01:38:33,920 --> 01:38:36,719
value anymore you are only allowed to
2402
01:38:36,719 --> 01:38:39,679
have access to see this back in whatever
2403
01:38:39,679 --> 01:38:42,080
instance you will create so that is why
2404
01:38:42,080 --> 01:38:44,159
if i was to hover my mouse here then
2405
01:38:44,159 --> 01:38:45,920
we're gonna see an error that is saying
2406
01:38:45,920 --> 01:38:48,880
property name cannot be set so the
2407
01:38:48,880 --> 01:38:51,840
pythonic way to doing this workaround to
2408
01:38:51,840 --> 01:38:53,440
get over this
2409
01:38:53,440 --> 01:38:56,400
is using one underscore before the name
2410
01:38:56,400 --> 01:38:59,119
of our actual attribute name that we
2411
01:38:59,119 --> 01:39:02,400
assign to the self object and by doing
2412
01:39:02,400 --> 01:39:05,040
this we earn a couple of things that are
2413
01:39:05,040 --> 01:39:07,760
quite important so first let me add here
2414
01:39:07,760 --> 01:39:10,159
an underscore and just use something
2415
01:39:10,159 --> 01:39:13,360
like that and then now i need to go to
2416
01:39:13,360 --> 01:39:15,679
my property function meaning the
2417
01:39:15,679 --> 01:39:18,000
property attribute and i'm gonna need to
2418
01:39:18,000 --> 01:39:20,159
add here the double underscore as well
2419
01:39:20,159 --> 01:39:22,080
because first things first i go ahead
2420
01:39:22,080 --> 01:39:24,400
and set up the value for my double
2421
01:39:24,400 --> 01:39:26,719
underscore excuse me single underscore
2422
01:39:26,719 --> 01:39:29,360
name into being equal to the
2423
01:39:29,360 --> 01:39:31,600
value of this parameter here and then i
2424
01:39:31,600 --> 01:39:33,520
go ahead and use one more read only
2425
01:39:33,520 --> 01:39:35,920
attribute that i intentionally give the
2426
01:39:35,920 --> 01:39:38,639
name of name and i and then i return
2427
01:39:38,639 --> 01:39:41,840
self dot underscore name now i can go
2428
01:39:41,840 --> 01:39:45,040
back to my main.py file and see what
2429
01:39:45,040 --> 01:39:47,360
effects those lines are having right now
2430
01:39:47,360 --> 01:39:50,480
on our instances so first i can go ahead
2431
01:39:50,480 --> 01:39:53,760
and set a name for my item and i can
2432
01:39:53,760 --> 01:39:57,440
access to the name of this item
2433
01:39:57,440 --> 01:39:59,760
by saying something like item one dot
2434
01:39:59,760 --> 01:40:02,000
name so i don't really have to go ahead
2435
01:40:02,000 --> 01:40:03,840
and use item one dot underscore name
2436
01:40:03,840 --> 01:40:05,520
because that is going to be a little bit
2437
01:40:05,520 --> 01:40:08,639
ugly and not convenient because
2438
01:40:08,639 --> 01:40:10,639
accessing attributes with always an
2439
01:40:10,639 --> 01:40:13,199
underscore before is not nice for each
2440
01:40:13,199 --> 01:40:15,280
of the instances that you look to access
2441
01:40:15,280 --> 01:40:17,760
to their attributes doing this one time
2442
01:40:17,760 --> 01:40:19,520
inside the class is going to make it
2443
01:40:19,520 --> 01:40:22,000
okay but trying to access those
2444
01:40:22,000 --> 01:40:24,480
attributes outside of your class meaning
2445
01:40:24,480 --> 01:40:26,719
from the instances is not going to turn
2446
01:40:26,719 --> 01:40:28,880
it into too much pretty so that is the
2447
01:40:28,880 --> 01:40:31,440
best way to overcome such a thing and
2448
01:40:31,440 --> 01:40:34,639
now if i was to try to print that
2449
01:40:34,639 --> 01:40:35,440
then
2450
01:40:35,440 --> 01:40:38,080
excuse me let me fix that quickly by
2451
01:40:38,080 --> 01:40:40,159
item1 dot name
2452
01:40:40,159 --> 01:40:42,000
and run our program then you can see
2453
01:40:42,000 --> 01:40:44,560
that that is working and now let's go
2454
01:40:44,560 --> 01:40:47,280
ahead and also see if we can set our
2455
01:40:47,280 --> 01:40:50,719
name into being equal to another
2456
01:40:50,719 --> 01:40:52,560
thing like that
2457
01:40:52,560 --> 01:40:54,480
see if that works you can see that i
2458
01:40:54,480 --> 01:40:58,080
cannot set that attribute but however i
2459
01:40:58,080 --> 01:41:01,679
can still see this underscore name from
2460
01:41:01,679 --> 01:41:04,560
the instance level and that is maybe
2461
01:41:04,560 --> 01:41:06,719
something that you look to avoid it
2462
01:41:06,719 --> 01:41:09,679
could have been a lot nicer if we could
2463
01:41:09,679 --> 01:41:12,880
somehow prevent totally the access from
2464
01:41:12,880 --> 01:41:15,840
this underscore name in here so the way
2465
01:41:15,840 --> 01:41:18,800
that this is achievable is by adding one
2466
01:41:18,800 --> 01:41:21,119
more underscore to the attribute name
2467
01:41:21,119 --> 01:41:23,360
now this might remind you something that
2468
01:41:23,360 --> 01:41:26,320
is called private attribute if you are
2469
01:41:26,320 --> 01:41:28,480
familiar with programming languages like
2470
01:41:28,480 --> 01:41:31,440
java or c-sharp that is pretty much the
2471
01:41:31,440 --> 01:41:33,520
same behavior of using the private
2472
01:41:33,520 --> 01:41:36,400
keyword before your attributes in those
2473
01:41:36,400 --> 01:41:38,639
kind of programming languages where it
2474
01:41:38,639 --> 01:41:40,639
has different principles when it comes
2475
01:41:40,639 --> 01:41:42,719
to object-oriented programming so to sum
2476
01:41:42,719 --> 01:41:44,719
up if you add one more underscore to
2477
01:41:44,719 --> 01:41:46,480
your attribute names meaning you use
2478
01:41:46,480 --> 01:41:48,480
double underscore then you basically
2479
01:41:48,480 --> 01:41:51,679
prevent the access to those attributes
2480
01:41:51,679 --> 01:41:55,040
totally outside of the class so let's
2481
01:41:55,040 --> 01:41:56,800
see a simulation of that so i'm going to
2482
01:41:56,800 --> 01:41:58,800
minimize the terminal and i'm going to
2483
01:41:58,800 --> 01:42:02,400
go to my item.py file and besides using
2484
01:42:02,400 --> 01:42:05,119
here single underscore i'm going to add
2485
01:42:05,119 --> 01:42:07,119
one more and then i'm going to change
2486
01:42:07,119 --> 01:42:09,280
this to double underscore as well and
2487
01:42:09,280 --> 01:42:13,600
now if we were to go to our main.py file
2488
01:42:13,600 --> 01:42:14,400
and
2489
01:42:14,400 --> 01:42:16,880
let's use here item one
2490
01:42:16,880 --> 01:42:19,520
dot and try to basically use
2491
01:42:19,520 --> 01:42:21,360
double underscore and try to access to
2492
01:42:21,360 --> 01:42:23,119
name now you can see that i don't even
2493
01:42:23,119 --> 01:42:24,960
have an auto completion from my drop
2494
01:42:24,960 --> 01:42:27,920
down because i don't have access to see
2495
01:42:27,920 --> 01:42:30,320
this attribute from the instance level
2496
01:42:30,320 --> 01:42:32,320
and that is something that you look to
2497
01:42:32,320 --> 01:42:34,560
achieve when you want to have a clean
2498
01:42:34,560 --> 01:42:36,719
read-only attribute and that is the way
2499
01:42:36,719 --> 01:42:39,119
that you can do that so if i was to try
2500
01:42:39,119 --> 01:42:41,840
to print this then that's just going to
2501
01:42:41,840 --> 01:42:44,239
complain about how it does not have the
2502
01:42:44,239 --> 01:42:46,800
attribute of double underscore name
2503
01:42:46,800 --> 01:42:48,400
in this instance
2504
01:42:48,400 --> 01:42:50,080
and again if i was to remove those
2505
01:42:50,080 --> 01:42:52,639
double underscores then i will just
2506
01:42:52,639 --> 01:42:55,360
access it as a property meaning as a
2507
01:42:55,360 --> 01:42:57,679
read-only attribute and that is exactly
2508
01:42:57,679 --> 01:43:00,000
what i look to have here all right so
2509
01:43:00,000 --> 01:43:02,639
now that we got the idea of that then we
2510
01:43:02,639 --> 01:43:05,119
still might be curious about how to
2511
01:43:05,119 --> 01:43:07,840
set a new value for the name attribute
2512
01:43:07,840 --> 01:43:09,760
now obviously using the property
2513
01:43:09,760 --> 01:43:12,239
decorator is going to turn this into
2514
01:43:12,239 --> 01:43:14,239
being a read-only attribute but there
2515
01:43:14,239 --> 01:43:15,920
are still some decorators that will
2516
01:43:15,920 --> 01:43:18,800
allow you to however set a new value for
2517
01:43:18,800 --> 01:43:19,760
this
2518
01:43:19,760 --> 01:43:22,400
property of name so let's see how that
2519
01:43:22,400 --> 01:43:24,239
is achievable so obviously that is not
2520
01:43:24,239 --> 01:43:26,880
going to work because it says
2521
01:43:26,880 --> 01:43:30,320
can't set attribute so what we can do is
2522
01:43:30,320 --> 01:43:32,800
we can use a new method where we can
2523
01:43:32,800 --> 01:43:35,920
declare that we'd like to also set a new
2524
01:43:35,920 --> 01:43:40,159
value for this attribute that we named
2525
01:43:40,159 --> 01:43:40,960
name
2526
01:43:40,960 --> 01:43:43,520
so the way that that's going to work is
2527
01:43:43,520 --> 01:43:46,320
by going to our class here and using
2528
01:43:46,320 --> 01:43:48,639
here one more method with a special
2529
01:43:48,639 --> 01:43:51,199
decorator now this decorator is going to
2530
01:43:51,199 --> 01:43:52,960
look like the following so i'm going to
2531
01:43:52,960 --> 01:43:54,639
refer to the
2532
01:43:54,639 --> 01:43:57,199
name because that's the property name
2533
01:43:57,199 --> 01:44:00,159
and then i'm going to use the dot setter
2534
01:44:00,159 --> 01:44:03,520
so by doing this then i basically say
2535
01:44:03,520 --> 01:44:06,239
hey so i still want to set a new value
2536
01:44:06,239 --> 01:44:08,400
for that name although
2537
01:44:08,400 --> 01:44:11,280
that is a property meaning a read-only
2538
01:44:11,280 --> 01:44:13,679
attribute so now if i was to
2539
01:44:13,679 --> 01:44:16,880
go down and say something like def name
2540
01:44:16,880 --> 01:44:19,760
and this would receive self and as well
2541
01:44:19,760 --> 01:44:21,679
as one additional parameter because the
2542
01:44:21,679 --> 01:44:23,520
additional parameter should refer to the
2543
01:44:23,520 --> 01:44:25,679
new value that i want to set to that
2544
01:44:25,679 --> 01:44:28,000
name so i will receive a parameter that
2545
01:44:28,000 --> 01:44:30,400
i could name something like value and
2546
01:44:30,400 --> 01:44:33,360
then inside here i'm only going to set
2547
01:44:33,360 --> 01:44:36,159
the new value for our double underscore
2548
01:44:36,159 --> 01:44:38,320
name because if you remember
2549
01:44:38,320 --> 01:44:41,280
when an instance tries to see the value
2550
01:44:41,280 --> 01:44:44,360
of name then we basically return
2551
01:44:44,360 --> 01:44:47,360
self.double underscore name so when a
2552
01:44:47,360 --> 01:44:51,040
user will try to set the name again to a
2553
01:44:51,040 --> 01:44:54,159
new value then it should execute self
2554
01:44:54,159 --> 01:44:55,040
dot
2555
01:44:55,040 --> 01:44:59,360
name equals to value and by doing this i
2556
01:44:59,360 --> 01:45:02,239
basically allow our users to yet set a
2557
01:45:02,239 --> 01:45:04,080
new value for
2558
01:45:04,080 --> 01:45:04,880
name
2559
01:45:04,880 --> 01:45:06,880
so now let's show what effect those
2560
01:45:06,880 --> 01:45:08,719
three lines are going to have in our
2561
01:45:08,719 --> 01:45:11,119
main dot py you can see that now the
2562
01:45:11,119 --> 01:45:15,040
error is gone i can now go down here and
2563
01:45:15,040 --> 01:45:18,000
use print item one dot name
2564
01:45:18,000 --> 01:45:20,080
and that's going to work you can see
2565
01:45:20,080 --> 01:45:23,440
that i have other item so this means not
2566
01:45:23,440 --> 01:45:27,199
only i can set a new value for my
2567
01:45:27,199 --> 01:45:29,199
underscore name so-called
2568
01:45:29,199 --> 01:45:32,000
in the initialization i can also do that
2569
01:45:32,000 --> 01:45:35,520
later on if i only use this convention
2570
01:45:35,520 --> 01:45:38,880
in here now those getters and said this
2571
01:45:38,880 --> 01:45:41,040
thing are always confusing in no matter
2572
01:45:41,040 --> 01:45:43,119
programming language you work so i will
2573
01:45:43,119 --> 01:45:45,679
do a final summary of all what we have
2574
01:45:45,679 --> 01:45:48,400
learned until this point all right so
2575
01:45:48,400 --> 01:45:50,880
using add property
2576
01:45:50,880 --> 01:45:53,119
will basically give you a control of
2577
01:45:53,119 --> 01:45:56,000
what you'd like to do when you get an
2578
01:45:56,000 --> 01:45:58,639
attribute and also by using this then
2579
01:45:58,639 --> 01:46:00,960
you basically convert this attribute
2580
01:46:00,960 --> 01:46:03,600
into being read only if i was not
2581
01:46:03,600 --> 01:46:04,719
implemented
2582
01:46:04,719 --> 01:46:06,880
these setters in
2583
01:46:06,880 --> 01:46:09,840
here so you can see that now when i
2584
01:46:09,840 --> 01:46:12,480
commented those out then this line is
2585
01:46:12,480 --> 01:46:15,040
going to have some problems because by
2586
01:46:15,040 --> 01:46:17,119
not doing this then i basically say that
2587
01:46:17,119 --> 01:46:19,520
hey name is read only you cannot set
2588
01:46:19,520 --> 01:46:21,840
that if i want to again uncomment those
2589
01:46:21,840 --> 01:46:24,320
back then i will have the control to set
2590
01:46:24,320 --> 01:46:26,480
this attribute to whatever attribute i'd
2591
01:46:26,480 --> 01:46:29,440
like to now by using
2592
01:46:29,440 --> 01:46:31,840
this statement here basically getting
2593
01:46:31,840 --> 01:46:34,719
the attribute then i basically call the
2594
01:46:34,719 --> 01:46:37,520
bunch of codes that are being executed
2595
01:46:37,520 --> 01:46:41,679
in here so whenever i use item1.name
2596
01:46:41,679 --> 01:46:43,840
then python says to itself okay you try
2597
01:46:43,840 --> 01:46:46,719
to get that attribute so i will go ahead
2598
01:46:46,719 --> 01:46:48,560
and try to execute all the lines of
2599
01:46:48,560 --> 01:46:50,320
codes are
2600
01:46:50,320 --> 01:46:53,040
that are here so that is what exactly
2601
01:46:53,040 --> 01:46:55,199
happening here and to show you that then
2602
01:46:55,199 --> 01:46:58,320
i can just use a random print function
2603
01:46:58,320 --> 01:47:00,080
here that will say
2604
01:47:00,080 --> 01:47:02,320
you are trying to
2605
01:47:02,320 --> 01:47:07,199
get name like that then you should see
2606
01:47:07,199 --> 01:47:09,600
this line being printed right before
2607
01:47:09,600 --> 01:47:12,000
what the actual value is because at
2608
01:47:12,000 --> 01:47:12,880
first
2609
01:47:12,880 --> 01:47:15,119
we print you are trying to print the
2610
01:47:15,119 --> 01:47:18,000
name and then we return the self dot
2611
01:47:18,000 --> 01:47:20,159
underscore name so it prints that over
2612
01:47:20,159 --> 01:47:22,800
here so that is what happening when you
2613
01:47:22,800 --> 01:47:23,920
try to
2614
01:47:23,920 --> 01:47:27,280
get an attribute but when you try to set
2615
01:47:27,280 --> 01:47:30,239
an attribute then python says to itself
2616
01:47:30,239 --> 01:47:33,360
okay so here you try to set an attribute
2617
01:47:33,360 --> 01:47:35,600
so because you set an attribute then i
2618
01:47:35,600 --> 01:47:37,520
should go ahead and
2619
01:47:37,520 --> 01:47:40,480
execute the code that is inside here
2620
01:47:40,480 --> 01:47:43,280
because that is the setter of that
2621
01:47:43,280 --> 01:47:45,760
attribute so that is why when you go
2622
01:47:45,760 --> 01:47:46,960
ahead and
2623
01:47:46,960 --> 01:47:48,880
use this decorator then you should
2624
01:47:48,880 --> 01:47:52,159
always receive a parameter because the
2625
01:47:52,159 --> 01:47:55,280
other item is going to be passed as an
2626
01:47:55,280 --> 01:47:58,000
argument to that parameter it is very
2627
01:47:58,000 --> 01:48:00,159
important to understand that and that is
2628
01:48:00,159 --> 01:48:02,960
why i can only allow myself to use one
2629
01:48:02,960 --> 01:48:05,920
line of code that will say self dot
2630
01:48:05,920 --> 01:48:07,600
double underscore name
2631
01:48:07,600 --> 01:48:10,719
is equal to the new value that you try
2632
01:48:10,719 --> 01:48:11,920
to
2633
01:48:11,920 --> 01:48:14,960
set and to show you that again i can go
2634
01:48:14,960 --> 01:48:17,520
here and say print
2635
01:48:17,520 --> 01:48:19,520
you are trying
2636
01:48:19,520 --> 01:48:22,560
to set and this line should appear just
2637
01:48:22,560 --> 01:48:24,880
before this print line because
2638
01:48:24,880 --> 01:48:26,880
at first i try to set
2639
01:48:26,880 --> 01:48:28,960
a different value for name and then i
2640
01:48:28,960 --> 01:48:31,840
just print it back like that okay so if
2641
01:48:31,840 --> 01:48:33,920
i was to run that then you can see that
2642
01:48:33,920 --> 01:48:35,920
at first we see the line of you are
2643
01:48:35,920 --> 01:48:38,560
trying to set then right after it we
2644
01:48:38,560 --> 01:48:41,440
actually see whatever item one dot name
2645
01:48:41,440 --> 01:48:43,920
is equal to now the reason that the
2646
01:48:43,920 --> 01:48:47,360
value is set it is because we set it
2647
01:48:47,360 --> 01:48:49,360
over here and then the next time i try
2648
01:48:49,360 --> 01:48:51,600
to get the value then those lines are
2649
01:48:51,600 --> 01:48:53,679
getting executed so that is the life
2650
01:48:53,679 --> 01:48:55,760
cycle of getters and setters and that is
2651
01:48:55,760 --> 01:48:58,080
the way that it works by having the
2652
01:48:58,080 --> 01:49:00,080
control of whatever you'd like to do
2653
01:49:00,080 --> 01:49:02,719
when you set a new value you can also
2654
01:49:02,719 --> 01:49:05,920
restrict it you can go ahead and do some
2655
01:49:05,920 --> 01:49:07,760
conditioning or you can go ahead and
2656
01:49:07,760 --> 01:49:10,080
raise some exceptions if you don't like
2657
01:49:10,080 --> 01:49:12,320
the value that you receive let's say
2658
01:49:12,320 --> 01:49:14,800
that you want to restrict the length of
2659
01:49:14,800 --> 01:49:17,040
the characters for the name of that
2660
01:49:17,040 --> 01:49:19,119
attribute all right so that is something
2661
01:49:19,119 --> 01:49:21,679
that you can do you can actually go here
2662
01:49:21,679 --> 01:49:23,199
and say if
2663
01:49:23,199 --> 01:49:24,560
len
2664
01:49:24,560 --> 01:49:26,159
of the value
2665
01:49:26,159 --> 01:49:30,000
is um greater than 10
2666
01:49:30,000 --> 01:49:32,719
then you would like to raise exception
2667
01:49:32,719 --> 01:49:34,320
that will say
2668
01:49:34,320 --> 01:49:36,719
something like
2669
01:49:36,719 --> 01:49:38,320
your
2670
01:49:38,320 --> 01:49:42,239
the name is too long something like that
2671
01:49:42,239 --> 01:49:43,840
and then you can say
2672
01:49:43,840 --> 01:49:46,080
else and then you can execute the line
2673
01:49:46,080 --> 01:49:47,920
that will be responsible to set that
2674
01:49:47,920 --> 01:49:49,840
value so intentionally i'm going to
2675
01:49:49,840 --> 01:49:51,599
leave it as it is because the length of
2676
01:49:51,599 --> 01:49:52,800
that is
2677
01:49:52,800 --> 01:49:54,880
nine characters so we should not have
2678
01:49:54,880 --> 01:49:58,960
any arrows but if i was to add here
2679
01:49:58,960 --> 01:50:01,440
two more characters like that and
2680
01:50:01,440 --> 01:50:03,520
execute it then you can see that we are
2681
01:50:03,520 --> 01:50:05,360
going to receive an exception that will
2682
01:50:05,360 --> 01:50:08,320
say the name is too long so that's how
2683
01:50:08,320 --> 01:50:10,080
ghettos and setters are working in
2684
01:50:10,080 --> 01:50:12,480
python you now have all the knowledge
2685
01:50:12,480 --> 01:50:14,320
that you need to play around with
2686
01:50:14,320 --> 01:50:16,719
different attributes and manage them the
2687
01:50:16,719 --> 01:50:18,960
way that you like to so i believe that
2688
01:50:18,960 --> 01:50:20,880
after the information that you received
2689
01:50:20,880 --> 01:50:24,080
in that episode you have everything that
2690
01:50:24,080 --> 01:50:25,840
you need to manage your attitude
2691
01:50:25,840 --> 01:50:27,760
successfully and play around with it and
2692
01:50:27,760 --> 01:50:30,080
as well as coming up with rich classes
2693
01:50:30,080 --> 01:50:32,080
that will have multiple attributes and
2694
01:50:32,080 --> 01:50:34,239
then you can set up special behaviors to
2695
01:50:34,239 --> 01:50:36,480
those attributes and also you can decide
2696
01:50:36,480 --> 01:50:39,599
that you'll not like to force to receive
2697
01:50:39,599 --> 01:50:41,440
those attributes in the constructor you
2698
01:50:41,440 --> 01:50:43,520
can decide that you can delete some
2699
01:50:43,520 --> 01:50:46,000
parameters in your constructor and you
2700
01:50:46,000 --> 01:50:48,880
can say that you will not like to assign
2701
01:50:48,880 --> 01:50:51,119
those to the self object immediately
2702
01:50:51,119 --> 01:50:53,440
when you create an instance so whatever
2703
01:50:53,440 --> 01:50:55,199
you would like to you have all the tools
2704
01:50:55,199 --> 01:50:58,159
to play around with how to manage your
2705
01:50:58,159 --> 01:51:00,719
attributes object-oriented programming
2706
01:51:00,719 --> 01:51:03,520
comes with four key principles that you
2707
01:51:03,520 --> 01:51:05,360
should be aware of so you will
2708
01:51:05,360 --> 01:51:07,840
understand how you should design your
2709
01:51:07,840 --> 01:51:10,719
large programs so it will be easier to
2710
01:51:10,719 --> 01:51:13,040
keep developing it and i'm going to talk
2711
01:51:13,040 --> 01:51:14,960
about those principles which are
2712
01:51:14,960 --> 01:51:17,840
encapsulation abstraction inheritance
2713
01:51:17,840 --> 01:51:20,560
and polymorphism so the first principle
2714
01:51:20,560 --> 01:51:22,719
will be encapsulation and we will talk
2715
01:51:22,719 --> 01:51:25,599
about this a little bit so encapsulation
2716
01:51:25,599 --> 01:51:28,400
refers to a mechanism of restricting the
2717
01:51:28,400 --> 01:51:31,199
direct access to some of our attributes
2718
01:51:31,199 --> 01:51:34,159
in a program now notice how we did a
2719
01:51:34,159 --> 01:51:36,719
great job in the last part where we
2720
01:51:36,719 --> 01:51:38,560
implemented the encapsulation principle
2721
01:51:38,560 --> 01:51:40,880
on our project so pay attention to how
2722
01:51:40,880 --> 01:51:43,280
the name attribute could not be set to a
2723
01:51:43,280 --> 01:51:46,080
new value before it goes through some
2724
01:51:46,080 --> 01:51:48,800
conditions that we set here like the
2725
01:51:48,800 --> 01:51:51,040
length of the character being less than
2726
01:51:51,040 --> 01:51:54,000
10 characters so restricting the ability
2727
01:51:54,000 --> 01:51:56,800
to override the values for your objects
2728
01:51:56,800 --> 01:51:59,840
within your setters is exactly what the
2729
01:51:59,840 --> 01:52:02,639
encapsulation principle is about now to
2730
01:52:02,639 --> 01:52:04,239
even give you a better example of
2731
01:52:04,239 --> 01:52:06,400
encapsulation principle then we are
2732
01:52:06,400 --> 01:52:08,719
going to apply similar things to an
2733
01:52:08,719 --> 01:52:10,560
additional attribute which is going to
2734
01:52:10,560 --> 01:52:13,280
be the price attribute now if we take a
2735
01:52:13,280 --> 01:52:15,360
quick look in that program that i have
2736
01:52:15,360 --> 01:52:16,560
just executed
2737
01:52:16,560 --> 01:52:18,400
then you can already see that i have the
2738
01:52:18,400 --> 01:52:21,199
ability to directly set this object into
2739
01:52:21,199 --> 01:52:23,760
whatever number that i like to also
2740
01:52:23,760 --> 01:52:26,639
negative 900 will work here so that's
2741
01:52:26,639 --> 01:52:28,480
probably something that we look to
2742
01:52:28,480 --> 01:52:30,560
change and the way that we can change
2743
01:52:30,560 --> 01:52:32,880
that is by implementing some methods
2744
01:52:32,880 --> 01:52:36,480
that will restrict the access to this
2745
01:52:36,480 --> 01:52:38,639
price attribute so it could have been
2746
01:52:38,639 --> 01:52:41,199
nice if we could have two methods that
2747
01:52:41,199 --> 01:52:43,360
will be responsible to increment this
2748
01:52:43,360 --> 01:52:45,920
price by some percentage amount and the
2749
01:52:45,920 --> 01:52:48,480
same goes for the discount now if you
2750
01:52:48,480 --> 01:52:50,719
remember we already came up with a
2751
01:52:50,719 --> 01:52:52,639
similar method that looks like apply
2752
01:52:52,639 --> 01:52:55,280
discount when we talked about class
2753
01:52:55,280 --> 01:52:57,920
attributes because self.pay rate
2754
01:52:57,920 --> 01:53:00,639
multiplied by the actual price
2755
01:53:00,639 --> 01:53:02,320
is actually going to change this
2756
01:53:02,320 --> 01:53:05,520
attribute being decreased by 20 because
2757
01:53:05,520 --> 01:53:08,480
pay rate is set to 0.8 if you remember
2758
01:53:08,480 --> 01:53:10,560
from the previous episodes so let's go
2759
01:53:10,560 --> 01:53:13,599
ahead and continue designing this price
2760
01:53:13,599 --> 01:53:15,760
attribute to totally support the
2761
01:53:15,760 --> 01:53:18,400
encapsulation principle so first things
2762
01:53:18,400 --> 01:53:20,480
first i'm going to convert this price
2763
01:53:20,480 --> 01:53:22,639
into being a private attribute so it
2764
01:53:22,639 --> 01:53:25,040
will be a great start avoiding to set
2765
01:53:25,040 --> 01:53:27,040
this price directly like we have seen
2766
01:53:27,040 --> 01:53:29,679
previously now i'm not going to just add
2767
01:53:29,679 --> 01:53:31,520
here double underscore besides i'm going
2768
01:53:31,520 --> 01:53:33,760
to grab this whole thing
2769
01:53:33,760 --> 01:53:35,040
i'm going to
2770
01:53:35,040 --> 01:53:37,119
right click and then i'm going to say
2771
01:53:37,119 --> 01:53:39,840
refactor rename and then i'm just going
2772
01:53:39,840 --> 01:53:43,440
to rename this price by setting it like
2773
01:53:43,440 --> 01:53:45,520
that double underscore before that now
2774
01:53:45,520 --> 01:53:47,599
doing this is actually going to refactor
2775
01:53:47,599 --> 01:53:50,320
this change on the entire class where we
2776
01:53:50,320 --> 01:53:52,719
try to access the price attribute so
2777
01:53:52,719 --> 01:53:54,880
that is a great thing so we don't really
2778
01:53:54,880 --> 01:53:56,960
have to change everywhere so once i have
2779
01:53:56,960 --> 01:53:58,880
done that then if we would also take a
2780
01:53:58,880 --> 01:54:01,040
look in the apply discount then you can
2781
01:54:01,040 --> 01:54:04,320
see that we have this being set to a new
2782
01:54:04,320 --> 01:54:06,800
variable name that we came up with so
2783
01:54:06,800 --> 01:54:08,960
now that we have done this then let's go
2784
01:54:08,960 --> 01:54:12,000
ahead and create a property so we will
2785
01:54:12,000 --> 01:54:14,000
have the ability to access the price
2786
01:54:14,000 --> 01:54:15,440
attribute
2787
01:54:15,440 --> 01:54:18,080
temporarily being only read only so i'm
2788
01:54:18,080 --> 01:54:21,040
going to say add property and then i'm
2789
01:54:21,040 --> 01:54:23,199
going to say def
2790
01:54:23,199 --> 01:54:24,320
price
2791
01:54:24,320 --> 01:54:26,560
then i'm just going to return
2792
01:54:26,560 --> 01:54:28,000
self.
2793
01:54:28,000 --> 01:54:30,719
price so that's a great starter to
2794
01:54:30,719 --> 01:54:32,560
restrict the access to the price
2795
01:54:32,560 --> 01:54:34,880
attribute because now we still have
2796
01:54:34,880 --> 01:54:37,679
access to the price attribute
2797
01:54:37,679 --> 01:54:40,080
and then we cannot set that so you can
2798
01:54:40,080 --> 01:54:42,400
see that if we were to try to access
2799
01:54:42,400 --> 01:54:44,159
item1.price
2800
01:54:44,159 --> 01:54:47,599
we will have some errors but we can just
2801
01:54:47,599 --> 01:54:49,360
access the
2802
01:54:49,360 --> 01:54:52,080
actual value of that where it comes from
2803
01:54:52,080 --> 01:54:54,960
the initialization so that's a
2804
01:54:54,960 --> 01:54:57,040
oh actually i see that we hit an error
2805
01:54:57,040 --> 01:54:59,199
that says recursion error and that's
2806
01:54:59,199 --> 01:55:00,560
probably because i did not add the
2807
01:55:00,560 --> 01:55:03,199
double underscore in here by mistake so
2808
01:55:03,199 --> 01:55:04,960
that's actually a great exception that
2809
01:55:04,960 --> 01:55:07,440
we came across right now you can see
2810
01:55:07,440 --> 01:55:09,760
that we are going to hit recursion error
2811
01:55:09,760 --> 01:55:12,239
maximum recursion depth exceeded and
2812
01:55:12,239 --> 01:55:14,000
that happened because i tried to return
2813
01:55:14,000 --> 01:55:15,920
the price without the double underscore
2814
01:55:15,920 --> 01:55:16,719
so
2815
01:55:16,719 --> 01:55:19,760
if we try to call the self.price then it
2816
01:55:19,760 --> 01:55:22,000
is going to try to call this function
2817
01:55:22,000 --> 01:55:23,920
and if we try to return that then it's
2818
01:55:23,920 --> 01:55:26,080
just going to loop over it again and in
2819
01:55:26,080 --> 01:55:28,320
some time it's going to fail with the
2820
01:55:28,320 --> 01:55:30,719
recursion error as you see so that's
2821
01:55:30,719 --> 01:55:32,480
actually a great exception that
2822
01:55:32,480 --> 01:55:35,119
we see now and if you see this exception
2823
01:55:35,119 --> 01:55:36,960
in your object-oriented programs now you
2824
01:55:36,960 --> 01:55:39,440
know how to handle it and if i was to
2825
01:55:39,440 --> 01:55:42,000
come back now to main and execute that
2826
01:55:42,000 --> 01:55:43,679
then you can see that the expected
2827
01:55:43,679 --> 01:55:46,560
result is here all right so now that we
2828
01:55:46,560 --> 01:55:48,639
have done this then let's go back to our
2829
01:55:48,639 --> 01:55:51,679
class and try to work on our methods
2830
01:55:51,679 --> 01:55:54,639
that will modify the attribute of double
2831
01:55:54,639 --> 01:55:57,920
underscore price so i will actually cut
2832
01:55:57,920 --> 01:56:01,280
this method from here and i will just
2833
01:56:01,280 --> 01:56:02,400
put that
2834
01:56:02,400 --> 01:56:05,599
right under the property price that we
2835
01:56:05,599 --> 01:56:07,920
came up with so we will have a cleaner
2836
01:56:07,920 --> 01:56:10,639
look now first things first you can see
2837
01:56:10,639 --> 01:56:12,960
that we have the apply discount and we
2838
01:56:12,960 --> 01:56:16,960
will also like to come up with apply
2839
01:56:16,960 --> 01:56:19,199
um increments
2840
01:56:19,199 --> 01:56:21,840
like the following and we would like to
2841
01:56:21,840 --> 01:56:23,040
say here
2842
01:56:23,040 --> 01:56:24,719
self dot
2843
01:56:24,719 --> 01:56:28,480
double underscore price is equal to self
2844
01:56:28,480 --> 01:56:30,960
dot double underscore price
2845
01:56:30,960 --> 01:56:32,159
plus
2846
01:56:32,159 --> 01:56:34,800
self dot double underscore price
2847
01:56:34,800 --> 01:56:37,760
multiplied by some value that we can
2848
01:56:37,760 --> 01:56:40,000
receive as a perimeter so we could
2849
01:56:40,000 --> 01:56:42,400
actually receive a parameter
2850
01:56:42,400 --> 01:56:45,199
that we could name increment
2851
01:56:45,199 --> 01:56:46,239
value
2852
01:56:46,239 --> 01:56:48,800
and then we could just multiply it by
2853
01:56:48,800 --> 01:56:51,199
that number so now that we came up with
2854
01:56:51,199 --> 01:56:53,760
this then let's test this up okay i'm
2855
01:56:53,760 --> 01:56:57,280
going to go back to my main.py and then
2856
01:56:57,280 --> 01:57:01,280
i'm going to call item1 dot apply
2857
01:57:01,280 --> 01:57:03,440
increment and then i'm just going to
2858
01:57:03,440 --> 01:57:07,280
pass in 0.2 so we will increment the
2859
01:57:07,280 --> 01:57:10,000
value of 750
2860
01:57:10,000 --> 01:57:11,679
by 20
2861
01:57:11,679 --> 01:57:14,159
now the next time that i access the item
2862
01:57:14,159 --> 01:57:15,599
one dot price
2863
01:57:15,599 --> 01:57:17,920
we should be able to see the actual
2864
01:57:17,920 --> 01:57:21,679
value of price which should be 900 and
2865
01:57:21,679 --> 01:57:23,760
if i was to run that then you can see
2866
01:57:23,760 --> 01:57:26,639
that the price has been incremented to
2867
01:57:26,639 --> 01:57:30,560
900 as expected so that is exactly
2868
01:57:30,560 --> 01:57:32,960
encapsulation in action because you go
2869
01:57:32,960 --> 01:57:35,520
ahead and you don't allow the access
2870
01:57:35,520 --> 01:57:38,400
directly to the price attribute besides
2871
01:57:38,400 --> 01:57:41,520
you modify this attribute by using
2872
01:57:41,520 --> 01:57:44,000
methods like apply increment or apply
2873
01:57:44,000 --> 01:57:46,480
discount now the same will happen if i
2874
01:57:46,480 --> 01:57:50,239
was to now go ahead and use item1 dot
2875
01:57:50,239 --> 01:57:51,599
apply
2876
01:57:51,599 --> 01:57:53,440
discount and you can actually modify
2877
01:57:53,440 --> 01:57:55,840
this method in the way that you like to
2878
01:57:55,840 --> 01:57:58,000
but this currently refers to a class
2879
01:57:58,000 --> 01:58:00,239
attribute that we use
2880
01:58:00,239 --> 01:58:03,119
here so this should also again apply a
2881
01:58:03,119 --> 01:58:06,960
discount of 20 to the 900 price we
2882
01:58:06,960 --> 01:58:09,920
should be able to see 720
2883
01:58:09,920 --> 01:58:11,920
and that's exactly what is happening
2884
01:58:11,920 --> 01:58:14,080
here all right so the next principle
2885
01:58:14,080 --> 01:58:16,000
that i'm going to talk about is called
2886
01:58:16,000 --> 01:58:18,639
abstraction now abstraction is the
2887
01:58:18,639 --> 01:58:21,280
concept of object-oriented programming
2888
01:58:21,280 --> 01:58:24,800
that only shows the necessary attributes
2889
01:58:24,800 --> 01:58:27,760
and hides the unnecessary information
2890
01:58:27,760 --> 01:58:30,719
now the main purpose of abstraction is
2891
01:58:30,719 --> 01:58:33,040
basically hiding unnecessary details
2892
01:58:33,040 --> 01:58:36,239
from the users now by seeing users i
2893
01:58:36,239 --> 01:58:39,040
basically mean people like me or you
2894
01:58:39,040 --> 01:58:41,520
that are going to use the item class to
2895
01:58:41,520 --> 01:58:44,560
create some item objects now you can see
2896
01:58:44,560 --> 01:58:46,960
that now we have a new program here that
2897
01:58:46,960 --> 01:58:50,159
has one item object that its name is my
2898
01:58:50,159 --> 01:58:52,800
item price being that number and we have
2899
01:58:52,800 --> 01:58:55,760
six from this item now you can also see
2900
01:58:55,760 --> 01:58:57,840
that i came up with a method that
2901
01:58:57,840 --> 01:58:59,840
doesn't really exist which is called
2902
01:58:59,840 --> 01:59:02,560
send email so that method at the end of
2903
01:59:02,560 --> 01:59:04,880
the day should send an email to someone
2904
01:59:04,880 --> 01:59:07,440
that would like to decide about this
2905
01:59:07,440 --> 01:59:10,000
item and it will send info about how
2906
01:59:10,000 --> 01:59:12,000
much money we can earn by selling all
2907
01:59:12,000 --> 01:59:15,360
the items and maybe about some more info
2908
01:59:15,360 --> 01:59:18,480
that is related to this item now
2909
01:59:18,480 --> 01:59:21,360
sending an email is not as easy action
2910
01:59:21,360 --> 01:59:24,239
just by calling it with that way
2911
01:59:24,239 --> 01:59:26,800
because in the background email sending
2912
01:59:26,800 --> 01:59:29,440
has to go a lot of processes like
2913
01:59:29,440 --> 01:59:32,159
connecting to an smtp server and as well
2914
01:59:32,159 --> 01:59:35,360
as preparing the body of the email with
2915
01:59:35,360 --> 01:59:37,599
an auto message that will display some
2916
01:59:37,599 --> 01:59:39,840
info about this item so as we can
2917
01:59:39,840 --> 01:59:41,520
understand we have to go through a lot
2918
01:59:41,520 --> 01:59:44,080
of new methods before we go ahead and
2919
01:59:44,080 --> 01:59:47,360
just call a send email method so to
2920
01:59:47,360 --> 01:59:49,440
simulate that then i can actually go
2921
01:59:49,440 --> 01:59:52,000
ahead and say send email so i will just
2922
01:59:52,000 --> 01:59:54,159
create the method that is necessary
2923
01:59:54,159 --> 01:59:57,040
temporarily i will use pass now as i
2924
01:59:57,040 --> 01:59:59,679
said we also have to go through a lot of
2925
01:59:59,679 --> 02:00:01,840
other processes so it is a great idea to
2926
02:00:01,840 --> 02:00:04,000
create methods for each of those
2927
02:00:04,000 --> 02:00:07,440
processes like connecting to an smtp
2928
02:00:07,440 --> 02:00:08,480
server
2929
02:00:08,480 --> 02:00:11,440
smtp server like that and i will just
2930
02:00:11,440 --> 02:00:13,760
say pass because we only try to simulate
2931
02:00:13,760 --> 02:00:16,080
the idea of abstraction here i'm not
2932
02:00:16,080 --> 02:00:18,080
really going to send an actual email to
2933
02:00:18,080 --> 02:00:20,719
someone i'm just simulating an idea of
2934
02:00:20,719 --> 02:00:22,960
sending an email and we will also have
2935
02:00:22,960 --> 02:00:26,000
to go through preparing a body for an
2936
02:00:26,000 --> 02:00:28,719
automatic mail prepare
2937
02:00:28,719 --> 02:00:32,239
body right and then i can just return a
2938
02:00:32,239 --> 02:00:35,599
formatted string that will say
2939
02:00:35,599 --> 02:00:38,560
something like hello
2940
02:00:38,560 --> 02:00:40,159
um
2941
02:00:40,159 --> 02:00:41,520
someone
2942
02:00:41,520 --> 02:00:43,280
we could receive this as a parameter as
2943
02:00:43,280 --> 02:00:46,000
well and then we can say
2944
02:00:46,000 --> 02:00:48,320
we have
2945
02:00:48,320 --> 02:00:51,320
self.name
2946
02:00:51,840 --> 02:00:54,480
six times right so it should be six
2947
02:00:54,480 --> 02:00:57,520
self dot quantity times like that
2948
02:00:57,520 --> 02:01:01,119
then i can say regards
2949
02:01:01,119 --> 02:01:03,599
to shape code so that is just a very
2950
02:01:03,599 --> 02:01:06,880
simple email that we can send to someone
2951
02:01:06,880 --> 02:01:08,560
now you can understand that we have to
2952
02:01:08,560 --> 02:01:11,679
call those methods inside the send email
2953
02:01:11,679 --> 02:01:15,040
so simulating that will be self dot
2954
02:01:15,040 --> 02:01:16,000
connect
2955
02:01:16,000 --> 02:01:18,159
and then self dot
2956
02:01:18,159 --> 02:01:19,599
and
2957
02:01:19,599 --> 02:01:21,199
prepare body
2958
02:01:21,199 --> 02:01:23,599
and probably we also need to go through
2959
02:01:23,599 --> 02:01:26,560
sending it right so we can just
2960
02:01:26,560 --> 02:01:29,199
say something like send here
2961
02:01:29,199 --> 02:01:31,840
then use pass again now you can see that
2962
02:01:31,840 --> 02:01:33,199
those methods
2963
02:01:33,199 --> 02:01:35,119
at the end of the day are only going to
2964
02:01:35,119 --> 02:01:37,840
be called from the send email because
2965
02:01:37,840 --> 02:01:40,960
those are just parts of the email
2966
02:01:40,960 --> 02:01:44,239
sending process that is a bigger process
2967
02:01:44,239 --> 02:01:46,639
that we divided into multiple steps in
2968
02:01:46,639 --> 02:01:50,239
this class now the biggest problem is we
2969
02:01:50,239 --> 02:01:52,000
will have access
2970
02:01:52,000 --> 02:01:53,760
calling those methods
2971
02:01:53,760 --> 02:01:56,239
from the instance and that is exactly
2972
02:01:56,239 --> 02:01:58,880
what abstraction is about abstraction
2973
02:01:58,880 --> 02:02:01,280
principle says to you that you should
2974
02:02:01,280 --> 02:02:04,480
hide unnecessary information from the
2975
02:02:04,480 --> 02:02:08,400
instances so that is why by converting
2976
02:02:08,400 --> 02:02:11,040
those methods into being private methods
2977
02:02:11,040 --> 02:02:13,599
then we actually apply abstraction
2978
02:02:13,599 --> 02:02:15,840
principles and that is achievable in
2979
02:02:15,840 --> 02:02:18,159
python in a way which i'm going to be
2980
02:02:18,159 --> 02:02:21,119
honest is not too much convenient but it
2981
02:02:21,119 --> 02:02:23,599
is achievable by adding double
2982
02:02:23,599 --> 02:02:25,679
underscore now again in other
2983
02:02:25,679 --> 02:02:28,560
programming languages this is achievable
2984
02:02:28,560 --> 02:02:31,280
by having access modifiers for your
2985
02:02:31,280 --> 02:02:34,320
methods like private or public and i'm
2986
02:02:34,320 --> 02:02:35,599
talking about
2987
02:02:35,599 --> 02:02:38,159
programming languages like java c-sharp
2988
02:02:38,159 --> 02:02:41,199
etc so if we were to convert those
2989
02:02:41,199 --> 02:02:43,520
methods to private methods by only
2990
02:02:43,520 --> 02:02:46,719
adding double underscore then those only
2991
02:02:46,719 --> 02:02:48,159
could be called
2992
02:02:48,159 --> 02:02:51,040
from the class level meaning inside the
2993
02:02:51,040 --> 02:02:53,920
class so if we were to try to access it
2994
02:02:53,920 --> 02:02:55,679
then you can see that i'm going to have
2995
02:02:55,679 --> 02:02:58,960
auto completion meaning i will have the
2996
02:02:58,960 --> 02:03:01,599
ability to access those methods
2997
02:03:01,599 --> 02:03:04,480
and then i will just do the same for
2998
02:03:04,480 --> 02:03:07,040
the other methods now this error comes
2999
02:03:07,040 --> 02:03:08,639
from here because we did not really
3000
02:03:08,639 --> 02:03:11,280
specify some argument i'm just going to
3001
02:03:11,280 --> 02:03:13,679
add an empty string now if i was to go
3002
02:03:13,679 --> 02:03:15,840
back to our main.py file then you're
3003
02:03:15,840 --> 02:03:17,440
gonna see that we are going to have some
3004
02:03:17,440 --> 02:03:19,760
troubles even if i'm going to try to
3005
02:03:19,760 --> 02:03:21,760
access it with a double underscore i'm
3006
02:03:21,760 --> 02:03:24,400
not even going to have an autocompletion
3007
02:03:24,400 --> 02:03:26,000
and the reason for that it is because
3008
02:03:26,000 --> 02:03:28,320
that is a private method so you really
3009
02:03:28,320 --> 02:03:30,480
have to think about your methods if you
3010
02:03:30,480 --> 02:03:32,960
want to make them accessible outside of
3011
02:03:32,960 --> 02:03:35,840
your class meaning from the instances
3012
02:03:35,840 --> 02:03:38,320
and that is exactly what abstraction is
3013
02:03:38,320 --> 02:03:40,400
about you want to abstract the
3014
02:03:40,400 --> 02:03:43,599
information that is unnecessary to call
3015
02:03:43,599 --> 02:03:47,040
it or to access it from your instances
3016
02:03:47,040 --> 02:03:49,119
okay so inheritance is the third
3017
02:03:49,119 --> 02:03:51,679
principle of object-oriented programming
3018
02:03:51,679 --> 02:03:53,920
inheritance is a mechanism that allows
3019
02:03:53,920 --> 02:03:57,840
us to reuse code across our classes now
3020
02:03:57,840 --> 02:03:59,679
that's something that we have totally
3021
02:03:59,679 --> 02:04:02,079
designed well throughout this course
3022
02:04:02,079 --> 02:04:04,719
because we came up with more classes
3023
02:04:04,719 --> 02:04:07,440
that are child classes of the item class
3024
02:04:07,440 --> 02:04:10,719
where each child class represents a kind
3025
02:04:10,719 --> 02:04:12,159
of an item
3026
02:04:12,159 --> 02:04:14,320
now pay attention how i changed the
3027
02:04:14,320 --> 02:04:16,159
import line from
3028
02:04:16,159 --> 02:04:19,199
phone import phone and i use the child
3029
02:04:19,199 --> 02:04:21,280
class of item which we came up with
3030
02:04:21,280 --> 02:04:23,599
which is called phone you can see that
3031
02:04:23,599 --> 02:04:26,159
i'm passing similar arguments and i can
3032
02:04:26,159 --> 02:04:29,119
still use a code that is implemented in
3033
02:04:29,119 --> 02:04:31,440
the parent class if we were to execute
3034
02:04:31,440 --> 02:04:33,119
this program then we are not going to
3035
02:04:33,119 --> 02:04:35,920
receive any problems because
3036
02:04:35,920 --> 02:04:37,119
phone
3037
02:04:37,119 --> 02:04:40,880
uses all the methods and attributes that
3038
02:04:40,880 --> 02:04:43,360
it inherits from the item class which is
3039
02:04:43,360 --> 02:04:45,760
exactly here and if we remember we
3040
02:04:45,760 --> 02:04:48,000
designed the send email method in the
3041
02:04:48,000 --> 02:04:50,159
parent class and we can use it from the
3042
02:04:50,159 --> 02:04:52,639
instance of a phone and we can also do
3043
02:04:52,639 --> 02:04:54,719
that for the rest of the methods that we
3044
02:04:54,719 --> 02:04:57,119
came up with that really affects some of
3045
02:04:57,119 --> 02:04:59,679
the attributes like in the
3046
02:04:59,679 --> 02:05:02,719
encapsulation part where we applied
3047
02:05:02,719 --> 02:05:05,679
the apply increment method that receives
3048
02:05:05,679 --> 02:05:08,000
an increment value and if we were to
3049
02:05:08,000 --> 02:05:09,440
test this
3050
02:05:09,440 --> 02:05:13,440
incrementing the price by 0.2 and then
3051
02:05:13,440 --> 02:05:16,320
printing item one dot price then we
3052
02:05:16,320 --> 02:05:19,119
should see 1200 so if we were to print
3053
02:05:19,119 --> 02:05:21,119
that then you can see that that is
3054
02:05:21,119 --> 02:05:23,599
exactly the result so that is mainly
3055
02:05:23,599 --> 02:05:26,239
what inheritance is about it is about
3056
02:05:26,239 --> 02:05:29,280
reusing the code across all the classes
3057
02:05:29,280 --> 02:05:31,679
and that's exactly the scenario here and
3058
02:05:31,679 --> 02:05:34,000
the beauty behind that is that you can
3059
02:05:34,000 --> 02:05:36,400
come up with more tried classes that
3060
02:05:36,400 --> 02:05:39,119
will represent kinds of items like
3061
02:05:39,119 --> 02:05:41,520
laptop keyboard camera everything that
3062
02:05:41,520 --> 02:05:43,920
you think about and then you can just
3063
02:05:43,920 --> 02:05:46,560
modify specific methods that you'd like
3064
02:05:46,560 --> 02:05:48,800
to according to the kind of item that
3065
02:05:48,800 --> 02:05:51,920
you have so that's perfectly describing
3066
02:05:51,920 --> 02:05:54,880
what inheritance is about all right so
3067
02:05:54,880 --> 02:05:57,520
the last principle that we have now is
3068
02:05:57,520 --> 02:06:00,400
polymorphism now polymorphism is a very
3069
02:06:00,400 --> 02:06:02,480
important concept in programming it
3070
02:06:02,480 --> 02:06:06,159
refers to use of a single type entity to
3071
02:06:06,159 --> 02:06:08,239
represent different types in different
3072
02:06:08,239 --> 02:06:11,440
scenarios now a perfect example for this
3073
02:06:11,440 --> 02:06:14,239
definition will be some of the functions
3074
02:06:14,239 --> 02:06:16,079
that we already know that exist in
3075
02:06:16,079 --> 02:06:18,639
python now just a quick side note
3076
02:06:18,639 --> 02:06:22,639
polymorphism refers to many forms poly
3077
02:06:22,639 --> 02:06:26,400
being many and morphism being forms so
3078
02:06:26,400 --> 02:06:29,040
again the idea of applying polymorphism
3079
02:06:29,040 --> 02:06:31,679
on our programs is the ability to have
3080
02:06:31,679 --> 02:06:34,480
different scenarios when we call the
3081
02:06:34,480 --> 02:06:37,520
exact same entity and an entity could be
3082
02:06:37,520 --> 02:06:39,520
a function that we just call now as you
3083
02:06:39,520 --> 02:06:41,520
can understand polymorphism isn't
3084
02:06:41,520 --> 02:06:43,679
something that is specifically applied
3085
02:06:43,679 --> 02:06:46,079
to how you create your classes that is
3086
02:06:46,079 --> 02:06:48,400
actually something that refers globally
3087
02:06:48,400 --> 02:06:50,719
to your entire project and in the next
3088
02:06:50,719 --> 02:06:52,639
few minutes we are going to see some bad
3089
02:06:52,639 --> 02:06:54,880
practices where polymorphism is not
3090
02:06:54,880 --> 02:06:56,800
applied and we are also going to see
3091
02:06:56,800 --> 02:06:58,800
where in python polymorphism is
3092
02:06:58,800 --> 02:07:01,760
perfectly applied so a great example of
3093
02:07:01,760 --> 02:07:04,400
where polymorphism is applied is in the
3094
02:07:04,400 --> 02:07:07,280
lan built-in function because the lan
3095
02:07:07,280 --> 02:07:10,239
built-in function in python knows how to
3096
02:07:10,239 --> 02:07:12,880
handle different kinds of objects that
3097
02:07:12,880 --> 02:07:15,440
it receives as an argument and it
3098
02:07:15,440 --> 02:07:18,159
returns you a result accordingly so as
3099
02:07:18,159 --> 02:07:20,960
you can see in here if we were to use
3100
02:07:20,960 --> 02:07:24,560
the land built-in function in a string
3101
02:07:24,560 --> 02:07:26,960
then we will receive the total amount of
3102
02:07:26,960 --> 02:07:30,960
characters but if we will do this in a
3103
02:07:30,960 --> 02:07:33,360
list then we will not receive the length
3104
02:07:33,360 --> 02:07:35,360
of characters of this entire expression
3105
02:07:35,360 --> 02:07:38,400
in here besides we will receive back the
3106
02:07:38,400 --> 02:07:41,440
amount of elements that are inside this
3107
02:07:41,440 --> 02:07:43,679
list and to show you how this is going
3108
02:07:43,679 --> 02:07:46,000
to work then i'm just going to run this
3109
02:07:46,000 --> 02:07:48,159
program and for sure the results are
3110
02:07:48,159 --> 02:07:50,960
just as expected so as the definition of
3111
02:07:50,960 --> 02:07:53,599
polymorphism says it is just a single
3112
02:07:53,599 --> 02:07:55,920
entity that does know how to handle
3113
02:07:55,920 --> 02:07:59,199
different kinds of objects as expected
3114
02:07:59,199 --> 02:08:01,199
all right so now that we understood that
3115
02:08:01,199 --> 02:08:03,440
the polymorphism is applied everywhere
3116
02:08:03,440 --> 02:08:05,199
in python especially in the land
3117
02:08:05,199 --> 02:08:07,440
building function let's also understand
3118
02:08:07,440 --> 02:08:09,840
where it is implemented on our project
3119
02:08:09,840 --> 02:08:12,079
here now you can see that i try to call
3120
02:08:12,079 --> 02:08:14,480
the apply discount method that is never
3121
02:08:14,480 --> 02:08:16,719
implemented inside the phone class and
3122
02:08:16,719 --> 02:08:19,840
the fact that i can use it from the item
3123
02:08:19,840 --> 02:08:21,920
class it is because we inherit from this
3124
02:08:21,920 --> 02:08:25,440
class and that is the basically reason
3125
02:08:25,440 --> 02:08:27,599
now if i was to go back to that main dot
3126
02:08:27,599 --> 02:08:30,000
py file and run this then you can see
3127
02:08:30,000 --> 02:08:32,000
that that is going to work because the
3128
02:08:32,000 --> 02:08:34,880
applied discount is a method that i can
3129
02:08:34,880 --> 02:08:38,000
use from the inherited item class now
3130
02:08:38,000 --> 02:08:39,760
that's exactly where polymorphism is
3131
02:08:39,760 --> 02:08:42,560
also in action because polymorphism
3132
02:08:42,560 --> 02:08:44,960
again refers to one single entity that
3133
02:08:44,960 --> 02:08:48,400
you can use from multiple objects now if
3134
02:08:48,400 --> 02:08:50,880
i was one day to go ahead and create
3135
02:08:50,880 --> 02:08:54,719
more kinds of items meaning more classes
3136
02:08:54,719 --> 02:08:56,480
that will represent different kinds of
3137
02:08:56,480 --> 02:08:58,880
items and from them to call the applied
3138
02:08:58,880 --> 02:09:01,199
discount method that's also going to
3139
02:09:01,199 --> 02:09:04,079
work because the applied discount is a
3140
02:09:04,079 --> 02:09:05,840
method that is going to be accessible
3141
02:09:05,840 --> 02:09:08,079
from all the kinds of objects so that's
3142
02:09:08,079 --> 02:09:10,000
exactly why you might have heard about
3143
02:09:10,000 --> 02:09:11,440
the terms of inheritance and
3144
02:09:11,440 --> 02:09:14,320
polymorphism together combined now to
3145
02:09:14,320 --> 02:09:16,800
show you that then let's try to create
3146
02:09:16,800 --> 02:09:18,159
one more class that is going to be
3147
02:09:18,159 --> 02:09:20,239
identical to the phone class right i'm
3148
02:09:20,239 --> 02:09:24,000
going to create a keyboard file and then
3149
02:09:24,000 --> 02:09:26,000
i'm just going to say here
3150
02:09:26,000 --> 02:09:27,280
class
3151
02:09:27,280 --> 02:09:29,119
you know what before that let's go to
3152
02:09:29,119 --> 02:09:29,920
phone
3153
02:09:29,920 --> 02:09:31,040
and
3154
02:09:31,040 --> 02:09:33,280
copy everything from here and paste this
3155
02:09:33,280 --> 02:09:36,480
in like that i'm going to get rid from
3156
02:09:36,480 --> 02:09:38,320
those lines
3157
02:09:38,320 --> 02:09:40,480
and i'm just going to leave the init as
3158
02:09:40,480 --> 02:09:43,599
it is i'm going to change the class name
3159
02:09:43,599 --> 02:09:44,560
from
3160
02:09:44,560 --> 02:09:46,880
phone to keyboard and i'm also going to
3161
02:09:46,880 --> 02:09:49,199
delete that attribute that we don't need
3162
02:09:49,199 --> 02:09:51,679
broken phones all right so now that we
3163
02:09:51,679 --> 02:09:54,320
have this then i can actually go ahead
3164
02:09:54,320 --> 02:09:57,280
to my main.py file and use one more
3165
02:09:57,280 --> 02:09:59,679
import line that will say from
3166
02:09:59,679 --> 02:10:02,480
keyboard import keyboard and then i'm
3167
02:10:02,480 --> 02:10:05,520
going to change this to keyboard
3168
02:10:05,520 --> 02:10:08,000
will replace this name just to make it
3169
02:10:08,000 --> 02:10:10,159
more realistic then i'm going to run the
3170
02:10:10,159 --> 02:10:11,760
same program
3171
02:10:11,760 --> 02:10:14,079
you can see that this works so that's
3172
02:10:14,079 --> 02:10:16,800
again exactly where polymorphism is in
3173
02:10:16,800 --> 02:10:18,639
action because we can use this single
3174
02:10:18,639 --> 02:10:21,119
entity from different kinds of objects
3175
02:10:21,119 --> 02:10:22,960
and it will know how to handle it
3176
02:10:22,960 --> 02:10:25,280
properly now by saying handle it
3177
02:10:25,280 --> 02:10:28,159
properly then i basically mean you can
3178
02:10:28,159 --> 02:10:31,119
have the control of how many amount of
3179
02:10:31,119 --> 02:10:33,760
discount you want to apply inside your
3180
02:10:33,760 --> 02:10:37,199
classes now because if we were to go to
3181
02:10:37,199 --> 02:10:40,960
keyboard and use a class
3182
02:10:40,960 --> 02:10:44,000
attribute exactly like we used in the
3183
02:10:44,000 --> 02:10:46,320
item class which was
3184
02:10:46,320 --> 02:10:48,560
pay rate then we're going to have full
3185
02:10:48,560 --> 02:10:50,800
control for all the discounts that are
3186
02:10:50,800 --> 02:10:53,119
going to apply to the keyboard and to
3187
02:10:53,119 --> 02:10:55,119
show you that i'm going to attempt
3188
02:10:55,119 --> 02:10:57,360
typing in pay rate and you can see that
3189
02:10:57,360 --> 02:10:59,679
i even have auto completion because
3190
02:10:59,679 --> 02:11:02,560
overriding in the child class that is
3191
02:11:02,560 --> 02:11:05,040
legal all right so i can just say pay
3192
02:11:05,040 --> 02:11:08,719
rate is equal to 0.7 and that will be it
3193
02:11:08,719 --> 02:11:12,079
now i have the same discount amount for
3194
02:11:12,079 --> 02:11:14,880
all my keyboards if i was again to run
3195
02:11:14,880 --> 02:11:17,280
the main.py file then you can see that
3196
02:11:17,280 --> 02:11:20,400
the results are just as expected we see
3197
02:11:20,400 --> 02:11:23,760
700 so that is the beauty behind
3198
02:11:23,760 --> 02:11:26,400
inheritance and polymorphism together
3199
02:11:26,400 --> 02:11:28,960
and the same will go for sure if we were
3200
02:11:28,960 --> 02:11:31,440
to decide that we'd like to have 50
3201
02:11:31,440 --> 02:11:33,840
discount so it will only take from me to
3202
02:11:33,840 --> 02:11:36,239
go ahead and say pay rate is equal to
3203
02:11:36,239 --> 02:11:39,920
0.5 and that's it so i hope that you
3204
02:11:39,920 --> 02:11:41,920
understand about polymorphism a bit
3205
02:11:41,920 --> 02:11:44,639
better now now just a quick side note
3206
02:11:44,639 --> 02:11:46,800
polymorphism is perfectly could be
3207
02:11:46,800 --> 02:11:49,599
implemented by using abstract classes
3208
02:11:49,599 --> 02:11:52,000
and that is just the identical way of
3209
02:11:52,000 --> 02:11:54,000
using interfaces in other programming
3210
02:11:54,000 --> 02:11:57,199
languages like java interface is a way
3211
02:11:57,199 --> 02:11:59,679
that you can implement how a class
3212
02:11:59,679 --> 02:12:00,719
should be
3213
02:12:00,719 --> 02:12:03,520
designed right so it is like a template
3214
02:12:03,520 --> 02:12:05,840
for a class and that is achievable by
3215
02:12:05,840 --> 02:12:07,920
using abstract classes which i'm not
3216
02:12:07,920 --> 02:12:10,800
going to cover in that part but again
3217
02:12:10,800 --> 02:12:14,079
polymorphism like i said is a term that
3218
02:12:14,079 --> 02:12:16,960
is implemented in different areas in the
3219
02:12:16,960 --> 02:12:19,760
whole python programming language so i
3220
02:12:19,760 --> 02:12:21,679
hope you had a great time learning the
3221
02:12:21,679 --> 02:12:23,760
object-oriented programming course now
3222
02:12:23,760 --> 02:12:25,920
you have a lot of tools that you can go
3223
02:12:25,920 --> 02:12:28,079
ahead and try to implement by yourself
3224
02:12:28,079 --> 02:12:30,079
on your projects which will really help
3225
02:12:30,079 --> 02:12:32,480
you to take you to the next step as a
3226
02:12:32,480 --> 02:12:36,480
developer see you next time
231155
Can't find what you're looking for?
Get subtitles in any language from opensubtitles.com, and translate them here.