WEBVTT

1
00:00:00.650 --> 00:00:02.120
<v ->Hi guys and welcome back.</v>

2
00:00:02.120 --> 00:00:05.710
In this video we're going to learn about class composition.

3
00:00:05.710 --> 00:00:08.250
Composition is a counterpart to inheritance

4
00:00:08.250 --> 00:00:11.530
so you build out classes that use other classes.

5
00:00:11.530 --> 00:00:14.660
You're going to be using inheritance very little in Python,

6
00:00:14.660 --> 00:00:15.493
if I'm honest,

7
00:00:15.493 --> 00:00:18.240
you're going to be using composition much more.

8
00:00:18.240 --> 00:00:21.000
Composition allows your classes to be simpler

9
00:00:21.000 --> 00:00:23.550
and reduces the complexity of your code overall,

10
00:00:23.550 --> 00:00:27.100
so it is recommended that you use that most of the time.

11
00:00:27.100 --> 00:00:29.820
In addition, composition means something different

12
00:00:29.820 --> 00:00:32.580
than inheritance when you're thinking about your classes.

13
00:00:32.580 --> 00:00:35.800
For example, we've got here a bookshelf class

14
00:00:35.800 --> 00:00:38.140
that takes in a quantity when you create it

15
00:00:38.140 --> 00:00:39.800
and then when you print it out it tells you

16
00:00:39.800 --> 00:00:41.990
that it's a bookshelf with x books.

17
00:00:41.990 --> 00:00:44.540
For example, here we're creating a bookshelf with 300 books,

18
00:00:44.540 --> 00:00:45.510
when you print it out,

19
00:00:45.510 --> 00:00:48.450
you can see that it says bookshelf with 300 books.

20
00:00:48.450 --> 00:00:51.570
If you wanted to create a book class now,

21
00:00:51.570 --> 00:00:53.630
some new programme has maybe attempted

22
00:00:53.630 --> 00:00:55.440
to make it inherit from bookshelf.

23
00:00:55.440 --> 00:00:57.440
After all, they are somehow related.

24
00:00:57.440 --> 00:00:58.273
Correct?

25
00:00:58.273 --> 00:00:59.533
Books live in bookshelves so.

26
00:01:00.520 --> 00:01:02.880
And then you would do something like this in it

27
00:01:02.880 --> 00:01:06.040
and then you would say the name of the book.

28
00:01:06.040 --> 00:01:10.860
But now if you want this book to call the superclasses

29
00:01:10.860 --> 00:01:14.520
in each method, you also need the quantity of books.

30
00:01:14.520 --> 00:01:17.100
So this is where this is trying to break down a little bit,

31
00:01:17.100 --> 00:01:21.630
a book object doesn't have a quantity of anything.

32
00:01:21.630 --> 00:01:23.810
So anyway, we are going to continue with that example

33
00:01:23.810 --> 00:01:26.080
because we firmly believe that

34
00:01:26.080 --> 00:01:28.270
a book should inherit from bookshelf.

35
00:01:28.270 --> 00:01:30.020
So you'll put your quantity in here

36
00:01:31.270 --> 00:01:33.180
and then you'll say self.name equal name.

37
00:01:33.180 --> 00:01:34.630
Okay, perfect.

38
00:01:34.630 --> 00:01:38.320
Now, this I'm sure you'll realise makes little sense

39
00:01:38.320 --> 00:01:42.600
because you are passing the quantity to a book.

40
00:01:42.600 --> 00:01:44.700
So when you create a book object,

41
00:01:44.700 --> 00:01:47.100
you're going to have to say Harry Potter

42
00:01:47.100 --> 00:01:50.780
and then you're going to have to say something like 120.

43
00:01:50.780 --> 00:01:52.830
Then if you print book,

44
00:01:52.830 --> 00:01:55.890
you'll get something out that's not all that good.

45
00:01:55.890 --> 00:02:00.630
You get bookshelf with 120 books when you print the book.

46
00:02:00.630 --> 00:02:05.630
So clearly you're going to need an str method here

47
00:02:05.820 --> 00:02:07.390
that prints something completely different.

48
00:02:07.390 --> 00:02:11.880
So for example, book self.name.

49
00:02:11.880 --> 00:02:13.720
Okay, let's press play again

50
00:02:13.720 --> 00:02:15.370
and now you get book Harry Potter.

51
00:02:15.370 --> 00:02:19.610
So why is this a bad approach?

52
00:02:19.610 --> 00:02:21.080
Well, there are two reasons.

53
00:02:21.080 --> 00:02:24.500
One of them is conceptual, the way of thinking about it.

54
00:02:24.500 --> 00:02:26.470
The other one is technical.

55
00:02:26.470 --> 00:02:30.610
The conceptual reason is that when you do inheritance,

56
00:02:30.610 --> 00:02:32.130
you are essentially treating it

57
00:02:32.130 --> 00:02:34.270
like evolutionary inheritance.

58
00:02:34.270 --> 00:02:39.270
You're saying that a book is a bookshelf and something more.

59
00:02:41.170 --> 00:02:45.880
For example, in the same way that all tigers are mammals,

60
00:02:45.880 --> 00:02:48.010
but not all mammals are tigers.

61
00:02:48.010 --> 00:02:50.180
So all books are bookshelves,

62
00:02:50.180 --> 00:02:52.120
but not all bookshelves are books.

63
00:02:52.120 --> 00:02:54.970
The bookshelf can still be used on its own.

64
00:02:54.970 --> 00:02:58.160
That breaks down when you talk about books and bookshelves,

65
00:02:58.160 --> 00:03:00.340
because a book is something completely different

66
00:03:00.340 --> 00:03:01.220
from a bookshelf.

67
00:03:01.220 --> 00:03:06.160
A bookshelf can contain books, but one isn't the other.

68
00:03:06.160 --> 00:03:08.850
The technical reason why this breaks down

69
00:03:08.850 --> 00:03:12.500
is because you've got this book class that inherits

70
00:03:12.500 --> 00:03:17.500
from bookshelf, but actually you are not using inside it

71
00:03:18.760 --> 00:03:20.230
anything about the bookshelf.

72
00:03:20.230 --> 00:03:22.830
So you are completely overriding the str method

73
00:03:22.830 --> 00:03:24.810
because you don't want anything to do with bookshelves

74
00:03:24.810 --> 00:03:27.900
in there and you actually don't need these at all

75
00:03:27.900 --> 00:03:31.930
because I mean, what's the point of setting the quantity

76
00:03:31.930 --> 00:03:34.620
if you're not going to use it in the methods?

77
00:03:34.620 --> 00:03:38.700
So the conceptual reason is a book is not a bookshelf.

78
00:03:38.700 --> 00:03:40.788
The technical reason is there is no reason

79
00:03:40.788 --> 00:03:42.880
to inherit if you're not gonna use

80
00:03:42.880 --> 00:03:44.460
that inheritance anywhere.

81
00:03:44.460 --> 00:03:48.060
So this is where composition comes in.

82
00:03:48.060 --> 00:03:52.740
Composition is for when you wanna say something like,

83
00:03:52.740 --> 00:03:55.120
a bookshelf has many books.

84
00:03:55.120 --> 00:04:00.120
A bookshelf is composed of a bunch of things and books.

85
00:04:00.710 --> 00:04:05.580
So instead of defining our bookshelf and our book like this,

86
00:04:05.580 --> 00:04:08.150
we're going to define it slightly differently.

87
00:04:08.150 --> 00:04:11.550
Instead of setting the quantity of books in the bookshelf,

88
00:04:11.550 --> 00:04:14.600
we're actually going to allow the constructor

89
00:04:14.600 --> 00:04:16.603
to take in a number of books.

90
00:04:17.800 --> 00:04:19.430
So we will do star books

91
00:04:19.430 --> 00:04:22.113
and then we'll say self.books, equal books.

92
00:04:22.990 --> 00:04:27.990
And then here we will say bookshelf with len of self.books.

93
00:04:28.480 --> 00:04:33.480
So what this will take in is a bunch of book objects.

94
00:04:35.400 --> 00:04:38.970
Next up, the book class doesn't actually need,

95
00:04:38.970 --> 00:04:40.660
I'm going to delete this as well for now,

96
00:04:40.660 --> 00:04:43.380
the book class doesn't need to inherit from bookshelf

97
00:04:43.380 --> 00:04:45.240
and it doesn't need the quantity

98
00:04:45.240 --> 00:04:48.270
and it doesn't need to call the superclass of anything.

99
00:04:48.270 --> 00:04:49.200
Okay.

100
00:04:49.200 --> 00:04:52.440
So now we have two much simpler classes,

101
00:04:52.440 --> 00:04:54.270
but how do you use them?

102
00:04:54.270 --> 00:04:56.320
Well, we can create our book

103
00:04:56.320 --> 00:04:58.120
and then we can create another book.

104
00:05:01.780 --> 00:05:02.613
Just like that.

105
00:05:02.613 --> 00:05:03.780
So we have our two books here.

106
00:05:03.780 --> 00:05:08.780
Then we'll create our bookshelf and give it the two books.

107
00:05:11.810 --> 00:05:13.963
Then we can print the shelf.

108
00:05:15.110 --> 00:05:17.180
So I'll press play now and you can see

109
00:05:17.180 --> 00:05:20.193
that you get bookshelf with two books printed out.

110
00:05:21.280 --> 00:05:24.480
This is composition and this is very common,

111
00:05:24.480 --> 00:05:26.250
much more common than inheritance.

112
00:05:26.250 --> 00:05:30.170
It is when you have a class that contains

113
00:05:30.170 --> 00:05:32.220
a bunch of other classes or a class

114
00:05:32.220 --> 00:05:34.640
that has as many of that.

115
00:05:34.640 --> 00:05:37.290
And the here we've got our bookshelf that has many books.

116
00:05:37.290 --> 00:05:39.330
And when you use it, when you create it,

117
00:05:39.330 --> 00:05:43.013
you can pass to it a bunch of your other book objects.

118
00:05:44.320 --> 00:05:45.960
So to recap.

119
00:05:45.960 --> 00:05:50.080
Inheritance means that a book is a bookshelf,

120
00:05:50.080 --> 00:05:53.830
composition means that a bookshelf has many books.

121
00:05:53.830 --> 00:05:55.670
So take your pick from those two,

122
00:05:55.670 --> 00:05:58.960
that's an important decision to make, but as I said earlier,

123
00:05:58.960 --> 00:06:02.190
you'll most frequently be using composition.

124
00:06:02.190 --> 00:06:03.540
Thanks for joining me in this video

125
00:06:03.540 --> 00:06:05.930
to learn about composition in Python,

126
00:06:05.930 --> 00:06:07.580
and I'll see you in the next one.

