1
00:00:00,130 --> 00:00:01,970
Hi guys and welcome back.

2
00:00:01,970 --> 00:00:03,890
In this video we're gonna talk about

3
00:00:03,890 --> 00:00:06,140
object oriented programming.

4
00:00:06,140 --> 00:00:08,790
Object oriented programming is a bit confusing

5
00:00:08,790 --> 00:00:11,070
when you get started, so if you've never seen

6
00:00:11,070 --> 00:00:13,950
object oriented programming before, just take it easy

7
00:00:13,950 --> 00:00:16,410
with the next few videos, watch them a couple of times

8
00:00:16,410 --> 00:00:18,330
if you need to, ask any questions in the course

9
00:00:18,330 --> 00:00:22,000
of the Q and A, if necessary we'll be there to help you out.

10
00:00:22,000 --> 00:00:24,780
Object oriented programming allows us as developers

11
00:00:24,780 --> 00:00:28,260
to write code in a slightly different way

12
00:00:28,260 --> 00:00:30,250
than we would write if we didn't have

13
00:00:30,250 --> 00:00:32,140
object oriented programming.

14
00:00:32,140 --> 00:00:34,900
The purpose of object oriented programming

15
00:00:34,900 --> 00:00:37,274
is to make our life as developers simpler

16
00:00:37,274 --> 00:00:41,641
by allowing us to write code that looks like

17
00:00:41,641 --> 00:00:44,480
what we would work with in the real world

18
00:00:44,480 --> 00:00:46,750
if we were talking about, you know,

19
00:00:46,750 --> 00:00:49,110
real world things like chairs and tables

20
00:00:49,110 --> 00:00:50,640
and printers and things like that,

21
00:00:50,640 --> 00:00:53,860
as opposed to code and data passing

22
00:00:53,860 --> 00:00:55,860
from one function to another.

23
00:00:55,860 --> 00:00:58,250
So that is the purpose of object oriented programming.

24
00:00:58,250 --> 00:00:59,990
And in this video we're going to look at how

25
00:00:59,990 --> 00:01:01,163
it works in Python.

26
00:01:02,260 --> 00:01:05,820
Let's say that you've got a dictionary like this one here

27
00:01:05,820 --> 00:01:09,370
which shows some information about a student.

28
00:01:09,370 --> 00:01:12,920
Now clearly this thing here is not a student,

29
00:01:12,920 --> 00:01:15,160
it is a dictionary that has some data.

30
00:01:15,160 --> 00:01:18,160
And as we know, programming is all about data,

31
00:01:18,160 --> 00:01:20,860
passing data from one place to another and so forth.

32
00:01:20,860 --> 00:01:23,500
So what we've got here is some data that is probably

33
00:01:23,500 --> 00:01:25,810
about a student somewhere in our classroom

34
00:01:25,810 --> 00:01:27,113
or something like that.

35
00:01:27,970 --> 00:01:31,012
Then we've got a function that takes in a sequence

36
00:01:31,012 --> 00:01:35,130
and adds the entire sequence together and divides it

37
00:01:35,130 --> 00:01:37,690
by the length of the sequence and then returns that.

38
00:01:37,690 --> 00:01:40,630
So it gives you the average of a sequence.

39
00:01:40,630 --> 00:01:43,120
For example we could use it to calculate the average

40
00:01:43,120 --> 00:01:45,180
grade of Rolf.

41
00:01:45,180 --> 00:01:46,520
How would you do that?

42
00:01:46,520 --> 00:01:48,739
Well you would have to use the function

43
00:01:48,739 --> 00:01:52,160
and give to it Rolf's grades.

44
00:01:52,160 --> 00:01:57,160
So you do average student grades, like that.

45
00:01:58,380 --> 00:02:01,540
So if we run that you'll see that we get out

46
00:02:01,540 --> 00:02:05,760
the value 88.0 which is the average grade.

47
00:02:05,760 --> 00:02:09,230
However, there is something about this function

48
00:02:09,230 --> 00:02:13,190
which is very important when you are thinking

49
00:02:13,190 --> 00:02:14,490
about object oriented programming,

50
00:02:14,490 --> 00:02:17,236
which is that this function doesn't know anything

51
00:02:17,236 --> 00:02:20,761
about the student.

52
00:02:20,761 --> 00:02:25,050
The function only operates on the input that it receives

53
00:02:25,050 --> 00:02:27,510
and that could be a set of student grades

54
00:02:27,510 --> 00:02:29,393
or it could be something else.

55
00:02:30,713 --> 00:02:34,850
So when we as developers are talking specifically

56
00:02:34,850 --> 00:02:37,460
about a student and we want to calculate specifically

57
00:02:37,460 --> 00:02:42,460
the average student grade for Rolf, it is much nicer

58
00:02:42,690 --> 00:02:46,435
if we can say hey student, what's your average

59
00:02:46,435 --> 00:02:51,170
as opposed to get the average of this sequence

60
00:02:51,170 --> 00:02:54,490
that could or could not be related to the student.

61
00:02:54,490 --> 00:02:59,462
So basically what I want to do is student.average.

62
00:02:59,462 --> 00:03:02,240
This is what object oriented programming

63
00:03:02,240 --> 00:03:04,430
will allow us to do.

64
00:03:04,430 --> 00:03:09,130
But in order to do that, student cannot be a dictionary

65
00:03:09,130 --> 00:03:12,180
because dictionaries you can't do that on.

66
00:03:12,180 --> 00:03:16,330
You have to code your own thing in Python that will

67
00:03:16,330 --> 00:03:21,180
allow you to call the average method inside it,

68
00:03:21,180 --> 00:03:24,390
and that will give you the average of the student.

69
00:03:24,390 --> 00:03:26,820
So it is a very different approach,

70
00:03:26,820 --> 00:03:30,760
and it is not necessarily superior,

71
00:03:30,760 --> 00:03:32,280
but it is different and allows

72
00:03:32,280 --> 00:03:35,000
you to think of your programmes in a different way.

73
00:03:35,000 --> 00:03:37,920
So let's rewrite this example here using object

74
00:03:37,920 --> 00:03:41,830
oriented programming so you'll have a look at the syntax.

75
00:03:41,830 --> 00:03:43,470
The syntax for object oriented programming

76
00:03:43,470 --> 00:03:46,900
or to define a class in Python is to type out a keyword

77
00:03:46,900 --> 00:03:50,160
class, and then the name of your class.

78
00:03:50,160 --> 00:03:53,560
So a class is a definition of something,

79
00:03:53,560 --> 00:03:56,680
but it doesn't create a particular student here,

80
00:03:56,680 --> 00:03:58,980
we're only defining how a student will behave.

81
00:04:00,080 --> 00:04:03,870
So you can say inside the function,

82
00:04:03,870 --> 00:04:06,680
notice that there are four spaces of indentation,

83
00:04:06,680 --> 00:04:08,450
you can define functions.

84
00:04:08,450 --> 00:04:10,760
So you can define a special function called

85
00:04:10,760 --> 00:04:15,090
the underscore underscore init underscore underscore.

86
00:04:15,090 --> 00:04:17,500
So this function name is very important,

87
00:04:17,500 --> 00:04:19,010
and it has two underscores at the start

88
00:04:19,010 --> 00:04:20,520
and two at the end.

89
00:04:20,520 --> 00:04:23,880
And then you put your brackets and in here we're going

90
00:04:23,880 --> 00:04:26,040
to type out self.

91
00:04:26,040 --> 00:04:28,610
Although this is again just a variable name

92
00:04:28,610 --> 00:04:30,470
like in every other function and you can call it

93
00:04:30,470 --> 00:04:31,770
whatever you want, it doesn't have to be self

94
00:04:31,770 --> 00:04:35,023
if you don't want, but self is the convention in Python.

95
00:04:36,060 --> 00:04:39,170
Then in the body of the function you can define

96
00:04:39,170 --> 00:04:40,520
anything you want.

97
00:04:40,520 --> 00:04:44,820
For example, self.name is going to be Rolf.

98
00:04:44,820 --> 00:04:48,230
And what this is doing is it is taking whatever self is

99
00:04:50,070 --> 00:04:54,390
and it is accessing the name property inside of self.

100
00:04:54,390 --> 00:04:57,130
So here we're using the dot notation

101
00:04:57,130 --> 00:04:59,420
to access something inside of self,

102
00:04:59,420 --> 00:05:02,060
and what we're accessing is the name property.

103
00:05:02,060 --> 00:05:04,970
And then we're giving it a value of Rolf.

104
00:05:04,970 --> 00:05:09,600
What that means is that when we use this class

105
00:05:09,600 --> 00:05:12,950
to create something, that thing is going

106
00:05:12,950 --> 00:05:14,180
to have a name of Rolf.

107
00:05:14,180 --> 00:05:17,310
So here's how you create a thing from a class.

108
00:05:17,310 --> 00:05:20,297
We can say something like student, notice that now

109
00:05:20,297 --> 00:05:21,580
this is lowercase because this is a new variable

110
00:05:21,580 --> 00:05:23,400
that we're creating right now,

111
00:05:23,400 --> 00:05:28,400
is a student, which is uppercase S because this the class.

112
00:05:28,900 --> 00:05:31,560
And now we're going to tell it to use the class

113
00:05:31,560 --> 00:05:35,160
to create what's called an object in Python

114
00:05:35,160 --> 00:05:38,500
to create a new thing that behaves

115
00:05:38,500 --> 00:05:40,930
like what this class defines.

116
00:05:40,930 --> 00:05:44,380
So when you do this Python creates a new

117
00:05:44,380 --> 00:05:47,460
essentially empty container if you will

118
00:05:47,460 --> 00:05:50,070
and it runs the init method.

119
00:05:50,070 --> 00:05:52,260
By the way it is a method and not a function

120
00:05:52,260 --> 00:05:54,270
because it is inside of a class.

121
00:05:54,270 --> 00:05:55,810
So when a function is inside of a class

122
00:05:55,810 --> 00:05:57,460
it's called a method.

123
00:05:57,460 --> 00:06:00,420
So when you call the student class,

124
00:06:00,420 --> 00:06:02,030
notice that this bracket notation here

125
00:06:02,030 --> 00:06:03,950
is used to call a function normally.

126
00:06:03,950 --> 00:06:05,950
But we can also use it to call a class.

127
00:06:05,950 --> 00:06:08,430
When you call that Python will automatically

128
00:06:08,430 --> 00:06:12,610
call the init method for you and it will create

129
00:06:12,610 --> 00:06:16,720
this empty thing called self, and you will be able

130
00:06:16,720 --> 00:06:20,300
to modify the name property inside self

131
00:06:20,300 --> 00:06:22,080
and give it the value Rolf.

132
00:06:22,080 --> 00:06:24,550
The name property won't exist by default so doing

133
00:06:24,550 --> 00:06:26,990
this also creates it, which is quite nice.

134
00:06:26,990 --> 00:06:31,690
So once that's done and this self object contains

135
00:06:31,690 --> 00:06:36,690
a name property, Python will give you back that self.

136
00:06:37,930 --> 00:06:40,530
And student will become a name

137
00:06:40,530 --> 00:06:43,480
for the self thing we created,

138
00:06:43,480 --> 00:06:46,550
that thing being an object, that's what they're called.

139
00:06:46,550 --> 00:06:49,710
So we're using this class through the init method

140
00:06:49,710 --> 00:06:53,010
to create an object and assign the name property

141
00:06:53,010 --> 00:06:56,170
inside that object to the string Rolf.

142
00:06:56,170 --> 00:06:59,730
Then that object is what becomes the value

143
00:06:59,730 --> 00:07:01,920
for our student variable.

144
00:07:01,920 --> 00:07:05,590
So you can now do print student.name,

145
00:07:05,590 --> 00:07:07,320
and here what we're doing is we're accessing

146
00:07:07,320 --> 00:07:10,340
the name property of our student variable

147
00:07:10,340 --> 00:07:12,760
which as you know is the self

148
00:07:12,760 --> 00:07:17,580
that we created earlier on, so that will give you Rolf.

149
00:07:17,580 --> 00:07:21,940
And if I run that you see that Rolf comes out.

150
00:07:21,940 --> 00:07:25,940
This is how object oriented programming works in Python.

151
00:07:25,940 --> 00:07:29,220
You call a class, the init method runs,

152
00:07:29,220 --> 00:07:31,860
and what you get back is the object you created

153
00:07:31,860 --> 00:07:33,890
and in the init method you have the opportunity

154
00:07:33,890 --> 00:07:36,980
to set and change its properties.

155
00:07:36,980 --> 00:07:38,750
So what we've got here is the name property

156
00:07:38,750 --> 00:07:40,210
that we're changing.

157
00:07:40,210 --> 00:07:43,670
As well as self.name equals Rolf, we can do self.grades

158
00:07:43,670 --> 00:07:45,863
and make it equal to what we had before,

159
00:07:47,290 --> 00:07:48,123
something like that.

160
00:07:48,123 --> 00:07:51,270
So we're making the grades property of self

161
00:07:51,270 --> 00:07:52,670
equal to this tuple.

162
00:07:52,670 --> 00:07:54,720
And then when the function finishes,

163
00:07:54,720 --> 00:07:57,780
the class gives back self to student

164
00:07:57,780 --> 00:08:01,400
and now you can print out student.grades

165
00:08:01,400 --> 00:08:04,550
if you want and that property will exist there as well,

166
00:08:04,550 --> 00:08:05,383
as you can see.

167
00:08:06,800 --> 00:08:08,900
So nothing terribly complicated up til now.

168
00:08:08,900 --> 00:08:10,500
There's a bit of data being passed from

169
00:08:10,500 --> 00:08:11,760
one place to another,

170
00:08:11,760 --> 00:08:15,330
but this is no different to what we had before really.

171
00:08:15,330 --> 00:08:17,650
If you wanted to get the average of these grades

172
00:08:17,650 --> 00:08:21,150
you would still have to pass them to a function

173
00:08:21,150 --> 00:08:24,570
called average for example and that would give you

174
00:08:24,570 --> 00:08:26,840
the average if you had the function defined.

175
00:08:26,840 --> 00:08:28,890
But using object oriented programming,

176
00:08:28,890 --> 00:08:30,970
there's one more thing you can do which is going

177
00:08:30,970 --> 00:08:33,360
to simplify your life greatly, and that is the main

178
00:08:33,360 --> 00:08:35,047
point of object oriented programming,

179
00:08:35,047 --> 00:08:38,106
which is to define another method such as

180
00:08:38,106 --> 00:08:42,450
the average method inside the class.

181
00:08:42,450 --> 00:08:47,450
And this method will take self as a parameter.

182
00:08:48,515 --> 00:08:51,660
Notice that self again doesn't have to be self,

183
00:08:51,660 --> 00:08:53,140
you can call it whatever you want.

184
00:08:53,140 --> 00:08:55,360
That's just the convention in Python,

185
00:08:55,360 --> 00:08:56,830
we usually call it self but you can call it

186
00:08:56,830 --> 00:08:57,740
whatever you want.

187
00:08:57,740 --> 00:09:00,312
So if you define a method inside a class,

188
00:09:00,312 --> 00:09:04,680
all the methods inside the class have to take a parameter

189
00:09:04,680 --> 00:09:09,223
which will be the object that was created initially.

190
00:09:10,620 --> 00:09:14,810
You can do return sum of self.grades divided by len

191
00:09:14,810 --> 00:09:16,173
of self.grades.

192
00:09:17,090 --> 00:09:22,090
Notice how this method here does not take a sequence,

193
00:09:22,860 --> 00:09:27,170
it just uses the object that was created up here.

194
00:09:27,170 --> 00:09:31,758
So how does Python know that it needs to call

195
00:09:31,758 --> 00:09:35,200
this method with this data here.

196
00:09:35,200 --> 00:09:38,270
Well here's how it works internally.

197
00:09:38,270 --> 00:09:40,710
When you create a new class, the init method

198
00:09:40,710 --> 00:09:45,710
runs and you get this new object placed in student.

199
00:09:46,061 --> 00:09:51,061
Then whenever you want to call this method here,

200
00:09:51,270 --> 00:09:56,158
all you have to do is type out student, the class,

201
00:09:56,158 --> 00:10:01,158
dot average, and then of course because this is essentially

202
00:10:01,320 --> 00:10:06,133
another function, you put in there the student object.

203
00:10:07,128 --> 00:10:12,128
And what this is doing is it's hauling the average method

204
00:10:12,140 --> 00:10:13,740
inside, that's what the dot means,

205
00:10:13,740 --> 00:10:15,380
inside the student class,

206
00:10:15,380 --> 00:10:16,940
so that's this one there.

207
00:10:16,940 --> 00:10:19,970
And the self parameter is going to take the value

208
00:10:19,970 --> 00:10:23,360
of the student variable which has that object

209
00:10:23,360 --> 00:10:25,210
that was created earlier on that contains

210
00:10:25,210 --> 00:10:27,060
the name and the grades.

211
00:10:27,060 --> 00:10:29,420
So if we save that and run it,

212
00:10:29,420 --> 00:10:31,563
you can see that you get 88.2.

213
00:10:32,850 --> 00:10:35,910
Now this is a little bit verbose, there's a few

214
00:10:35,910 --> 00:10:37,770
too many words in there, so Python has a nice bit

215
00:10:37,770 --> 00:10:40,002
of syntax that you can use instead of this one

216
00:10:40,002 --> 00:10:43,960
which is to remove the student argument

217
00:10:43,960 --> 00:10:46,400
from the average function and instead of calling

218
00:10:46,400 --> 00:10:49,500
the average method inside the class,

219
00:10:49,500 --> 00:10:52,481
call it on the object itself.

220
00:10:52,481 --> 00:10:56,370
So if you do student.average, Python is going

221
00:10:56,370 --> 00:11:01,020
to realise that student is a student object,

222
00:11:01,020 --> 00:11:03,240
so you probably want to pass it as self,

223
00:11:03,240 --> 00:11:05,090
as the first argument.

224
00:11:05,090 --> 00:11:07,360
So it will do the conversion for you,

225
00:11:07,360 --> 00:11:10,200
that is the same thing and one is the other,

226
00:11:10,200 --> 00:11:11,380
but this is a little bit shorter,

227
00:11:11,380 --> 00:11:12,680
a little bit easier to read.

228
00:11:12,680 --> 00:11:15,830
And if you name your variables well,

229
00:11:15,830 --> 00:11:18,287
then this is pretty obvious what it's gonna give you back,

230
00:11:18,287 --> 00:11:20,860
it's gonna give you the average of this student.

231
00:11:20,860 --> 00:11:24,680
Now you can make it even better, type average grade say,

232
00:11:24,680 --> 00:11:26,190
and that's going to be just a little bit

233
00:11:26,190 --> 00:11:27,580
more readable as well.

234
00:11:27,580 --> 00:11:29,510
And just to show you that this works,

235
00:11:29,510 --> 00:11:31,210
it does exactly the same thing.

236
00:11:31,210 --> 00:11:34,070
So this is the key benefit of object oriented programming.

237
00:11:34,070 --> 00:11:36,960
You can define methods inside a class

238
00:11:36,960 --> 00:11:39,880
that use the object that was initially created

239
00:11:39,880 --> 00:11:42,631
by the init method within them.

240
00:11:42,631 --> 00:11:43,960
Show that and you don't have to keep track

241
00:11:43,960 --> 00:11:45,890
of multiple different pieces of data

242
00:11:45,890 --> 00:11:50,000
and the object itself can contain these methods

243
00:11:50,000 --> 00:11:51,190
that you want to use inside it,

244
00:11:51,190 --> 00:11:55,640
so all the data and the methods are in one place

245
00:11:55,640 --> 00:11:57,078
inside the class.

246
00:11:57,078 --> 00:12:00,260
Now the init method can also take arguments

247
00:12:00,260 --> 00:12:01,700
or have parameters.

248
00:12:01,700 --> 00:12:06,340
For example, we can have a name parameter as well as self,

249
00:12:06,340 --> 00:12:09,900
so just to recap, all methods inside a class

250
00:12:09,900 --> 00:12:14,408
need to have a parameter such as self

251
00:12:14,408 --> 00:12:16,711
so they can take in the object that

252
00:12:16,711 --> 00:12:19,210
you have been constructing.

253
00:12:19,210 --> 00:12:22,330
But they can also take more arguments,

254
00:12:22,330 --> 00:12:24,630
so here we're going to have another parameter,

255
00:12:24,630 --> 00:12:27,347
the name parameter, and then you'll put the value

256
00:12:27,347 --> 00:12:30,000
of that parameter in the bracket

257
00:12:30,000 --> 00:12:32,480
of the student class call.

258
00:12:32,480 --> 00:12:36,163
So we can put here Bob, let's say.

259
00:12:36,163 --> 00:12:40,150
So now Bob will become the value for name.

260
00:12:40,150 --> 00:12:43,060
Notice that self is given for you, so you don't have

261
00:12:43,060 --> 00:12:45,420
to give it a name, this here will become

262
00:12:45,420 --> 00:12:46,633
the value for name.

263
00:12:47,760 --> 00:12:52,570
But notice that we're not using this name parameter anyway.

264
00:12:52,570 --> 00:12:56,010
We are accessing here self.name, but that's the name

265
00:12:56,010 --> 00:13:00,410
property inside self, it is not this parameter.

266
00:13:00,410 --> 00:13:02,020
If you wanted to access this parameter,

267
00:13:02,020 --> 00:13:04,160
you can do that by doing something like that.

268
00:13:04,160 --> 00:13:06,850
Self.name which is the name property inside self

269
00:13:06,850 --> 00:13:10,320
will take the value of the name variable

270
00:13:10,320 --> 00:13:13,710
inside this method which is this parameter here.

271
00:13:13,710 --> 00:13:17,818
So now if you print student.name you'll see that Bob

272
00:13:17,818 --> 00:13:21,493
will come out because that is what we defined

273
00:13:21,493 --> 00:13:23,370
in the init method.

274
00:13:23,370 --> 00:13:25,033
Let's do the same with grades.

275
00:13:26,900 --> 00:13:29,356
And now as well as name, we have to pass in

276
00:13:29,356 --> 00:13:32,420
a set of grades for the student.

277
00:13:32,420 --> 00:13:35,800
For example, we will do this one,

278
00:13:35,800 --> 00:13:37,950
give it just a little bit of a different set

279
00:13:37,950 --> 00:13:41,030
of grades there, and now we can press play

280
00:13:41,030 --> 00:13:43,950
and notice how the average grade changes.

281
00:13:43,950 --> 00:13:46,680
The average grade is now being calculated

282
00:13:46,680 --> 00:13:50,029
from this set of grades because they are stored

283
00:13:50,029 --> 00:13:54,400
in self.grades for this student.

284
00:13:54,400 --> 00:13:56,550
So when the average grade method is called

285
00:13:56,550 --> 00:13:58,510
it uses those grades.

286
00:13:58,510 --> 00:14:02,550
Remember that you can define multiple students if you want

287
00:14:02,550 --> 00:14:04,120
and that's totally fine.

288
00:14:04,120 --> 00:14:07,730
This call here in line 10 will call the init method,

289
00:14:07,730 --> 00:14:09,965
it will give you a new object, it will populate

290
00:14:09,965 --> 00:14:14,965
self.name of that object with the name argument

291
00:14:15,110 --> 00:14:19,530
and self.grades of the self object with this argument.

292
00:14:19,530 --> 00:14:22,780
And it will give you this student variable back.

293
00:14:22,780 --> 00:14:24,980
I'm gonna call this student two.

294
00:14:24,980 --> 00:14:27,670
The student two variable, exactly the same thing,

295
00:14:27,670 --> 00:14:30,600
calls the init method, passes Rolf as the name

296
00:14:30,600 --> 00:14:33,100
and it creates a new object and sets the name

297
00:14:33,100 --> 00:14:35,440
property of that new object to Rolf

298
00:14:35,440 --> 00:14:37,270
and the grades property of that new object

299
00:14:37,270 --> 00:14:39,220
to this set of grades here.

300
00:14:39,220 --> 00:14:41,410
And what you end up with are two separate

301
00:14:41,410 --> 00:14:43,240
containers of data.

302
00:14:43,240 --> 00:14:46,330
The student variable which is Bob and has these grades,

303
00:14:46,330 --> 00:14:49,242
and the student two variable which is Rolf

304
00:14:49,242 --> 00:14:50,075
and has these grades.

305
00:14:50,075 --> 00:14:52,733
So when you call student2.average_grade,

306
00:14:55,240 --> 00:14:58,973
again what Python is doing is it's calling the student class

307
00:14:58,973 --> 00:15:01,923
and passing student to there.

308
00:15:02,850 --> 00:15:05,770
So self is student two.

309
00:15:05,770 --> 00:15:08,940
When you sum the grades you're going to be summing

310
00:15:08,940 --> 00:15:11,300
these grades here because those are the grades

311
00:15:11,300 --> 00:15:14,109
that are stored inside student two.

312
00:15:14,109 --> 00:15:17,880
But of course you can still do student2.average_grade

313
00:15:17,880 --> 00:15:19,783
instead as that is a bit simpler.

314
00:15:21,110 --> 00:15:24,600
Pressing play now will give you 92.2 and 88.2

315
00:15:24,600 --> 00:15:28,440
as the two averages, one for each student.

316
00:15:28,440 --> 00:15:29,760
All right, that's everything for this video.

317
00:15:29,760 --> 00:15:31,250
I wanted to tell you a little bit about

318
00:15:31,250 --> 00:15:33,880
how object oriented programming works in Python,

319
00:15:33,880 --> 00:15:36,786
how you can define classes, how objects are created,

320
00:15:36,786 --> 00:15:40,160
and how methods work so that you can call them

321
00:15:40,160 --> 00:15:43,030
with the data in those objects.

322
00:15:43,030 --> 00:15:44,930
I hope it's all clear, but if it isn't,

323
00:15:44,930 --> 00:15:47,245
please ask a question in the course Q and A,

324
00:15:47,245 --> 00:15:48,780
we'll be more than happy to help you out.

325
00:15:48,780 --> 00:15:50,090
Thanks for joining me in this video

326
00:15:50,090 --> 00:15:51,740
and I'll see you in the next one.

