-
Notifications
You must be signed in to change notification settings - Fork 0
/
tut24_Multiple_inheritance_.py
144 lines (98 loc) · 4.17 KB
/
tut24_Multiple_inheritance_.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
'''
===================== Understanding Multiple Inheritance ======================
>> We can inherit more than one class in a class.
This is called Multiple Inheritance.
. While inheriting from more than one class, the order in which the classes
are inherited must be kept in mind.
MRO - Method resolution order
This is the order in which a child searches for a method or an attribute when it
inherits from multiple classes
Whenever we call a method or try to access an attribute of an instance
it first searches it in the class of instance if it doesn't find it, then
it searches in the parent classes, first in the class which is written first
and then the second class and so on. If it doesn't find the method or attribute in
any of the classes, it raises and Error.
________COde______
class Functions:
def __init__(self,name,storage,ram):
self.name = name
self.storage = storage
self.ram = ram
def call(self,num):
print(f"[{self.name}] -> Calling to {num}...")
@classmethod
def set_location(cls,location):
cls.location = location
class Phone:
def __init__(self,name,ram,price,storage):
self.name = name
self.storage = storage
self.ram = ram
self.price = price
def print_details(self):
return f'Name-{self.name}, RAM-{self.ram}, Storage-{self.storage}, Price-{self.price}' \
class SmartPhone(Phone,Functions):
def __init__(self,name,ram,price,storage,processor,architecture):
super().__init__(name,ram,price, storage)
self.processor = processor
self.architecture = architecture
nokia = SmartPhone('Nokia','8GB',15000,'128GB','SnapDragon360','64Bit')
nokia.set_location('Jamuna Colliery')
print(nokia.location)
nokia.print_details()
nokia.call(456789)
-------------------------------
Output -
Jamuna Colliery
[Nokia] -> Calling to 456789...
-------------------------------
Explantion - In the above code, we created a class named 'Functions' in which we defined
an instance method and a classmethod.
Next we created another class named Phone in which we created a constructor, and an instance
method.
Next we inherited Phone and Functions classes in Phone class.
In the constructor of Phone class, we called constructor of super class,
here comes the role MRO, method resolution order of SmartPhone class is
SmartPhone
Phone
Functions
It means that it first searches the method in SmartPhone class itself, if doesnt find
it then in Phone class and finally in Functions class when it doesnt find it in Phone class.
So, while calling super().__init__() it calls the constructor of Phone class which is
written first.
If we want to run the constructor of Function class, then we can run it as follows
Functions.__init__(arguments)
================================== VVIMP Note ======================================================
It is to be noted that in Functions class's call() method, we are using self.name, since
self.name instance variable in created by Phone class, it is running fine, but if it
would be something else like 'self.rname' which is created by the constructor of Functions class
then it would have thrown error because we are not running constructor of Functions Class.
'''
class Functions:
def __init__(self,name,storage,ram):
self.name = name
self.storage = storage
self.ram = ram
def call(self,num):
print(f"[{self.name}] -> Calling to {num}...")
@classmethod
def set_location(cls,location):
cls.location = location
class Phone:
def __init__(self,name,ram,price,storage):
self.name = name
self.storage = storage
self.ram = ram
self.price = price
def print_details(self):
return f'Name-{self.name}, RAM-{self.ram}, Storage-{self.storage}, Price-{self.price}' \
class SmartPhone(Phone,Functions):
def __init__(self,name,ram,price,storage,processor,architecture):
super().__init__(name,ram,price, storage)
self.processor = processor
self.architecture = architecture
nokia = SmartPhone('Nokia','8GB',15000,'128GB','SnapDragon360','64Bit')
nokia.set_location('Jamuna Colliery')
print(nokia.location)
nokia.print_details()
nokia.call(456789)