Professional Documents
Culture Documents
Basic_OOP
Basic_OOP
Abstract
Trong lập trình hướng đối tượng (OOP), việc sử dụng classes và objects đóng vai trò nền tảng, giúp
cho mã nguồn được tổ chức và quản lý một cách hiệu quả. Python, với khả năng hỗ trợ mạnh mẽ cho
OOP, cho phép ta mô hình hóa các thực thể trong thế giới thực thành các đối tượng với những thuộc
tính và phương thức riêng biệt. Trong bài học này, chúng ta sẽ cùng nhau tìm hiểu những kiến thức cơ
bản và quan trọng nhất về Classes và Objects, cùng với đó là những thao tác liên quan đến tính Kế
thừa (Inheritance) trong OOP, một tính chất giúp cho những hệ thống được xây dựng dựa trên Python
có khả năng tái sử dụng và mở rộng dễ dàng.
• Objects là các thể hiện (instance) của classes, tức là mỗi object được tạo ra từ một class sẽ có các
thuộc tính và phương thức được định nghĩa trong class đó.
• Một Class Diagram bao gồm: tên của class, các thuộc tính của class, các phương thức của class.
1
AI VIETNAM aivietnam.edu.vn
1 # Create a class
2 class Rectangle :
3 def __init__ ( self , my_width , my_height ) :
4 self . width = my_width
5 self . height = my_height
6
7 def calculate_area ( self ) :
8 self . area = self . width * self . height
9 return self . area
10
11 def ca lc ula te_ per ime ter ( self ) :
12 return ( self . width + self . height ) * 2
13
2
AI VIETNAM aivietnam.edu.vn
1 class MyClass :
2 def __init__ ( self , value ) :
3 self . value = value
4
5 obj = MyClass (10)
6 print ( obj . value ) # Output : 10
7
b. __str__()
Phương thức này được sử dụng để định nghĩa chuỗi đại diện của object, thường được sử dụng bởi hàm
print.
1 class MyClass :
2 def __init__ ( self , value ) :
3 self . value = value
4
5 def __str__ ( self ) :
6 return f " MyClass with value { self . value } "
7
8 obj = MyClass (10)
9 print ( obj ) # Output : MyClass with value 10
10
c. __len__()
Phương thức này được sử dụng để trả về độ dài (length) của object, thường được sử dụng bởi hàm len.
1 class MyCollection :
2 def __init__ ( self , items ) :
3 self . items = items
4
5 def __len__ ( self ) :
6 return len ( self . items )
7
8 collection = MyCollection ([1 , 2 , 3 , 4])
9 print ( len ( collection ) ) # Output : 4
10
d. __call__()
Phương thức này cho phép một object có thể được gọi như một hàm.
3
AI VIETNAM aivietnam.edu.vn
1 class Adder :
2 def __init__ ( self , value ) :
3 self . value = value
4
5 def __call__ ( self , x ) :
6 return self . value + x
7
8 add_five = Adder (5)
9 print ( add_five (10) ) # Output : 15
10
1.6. Sử dụng object của Class này làm thuộc tính của Class khác
Thuộc tính của một class có thể là bất kỳ đối tượng nào, bao gồm các biến có kiểu dữ liệu nguyên
thủy (integer, float, boolean,...), các iterable (list, tuple, string...), hay thậm chí cả object của một class
đã được khai báo trước đó. Trong ví dụ này, thuộc tính birth trong class Person nhận giá trị là một
object được khởi tạo từ class Date đã được định nghĩa trước đó.
1 class Date :
2 def __init__ ( self , day , month , year ) :
3 self . day = day
4 self . month = month
5 self . year = year
6
7 def __call__ ( self ) :
8 return f " { self . day :02 d }/{ self . month :02 d }/{ self . year } "
9
10 class Person :
11 def __init__ ( self , name , birth ) :
12 self . name = name
13 self . birth = birth
14
15 def info ( self ) :
16 print ( f " Name : { self . name } - Birth : { self . birth () } " )
17
18 name = " Isaac Newton "
19 birth = Date (4 , 1 , 1643)
20 physicist = Person ( name , birth )
21 physicist . info ()
22 # Output : Name : Isaac Newton - Birth : 04/01/1643
23
2. Inheritance
Kế thừa là một trong những tính năng mạnh mẽ nhất của lập trình hướng đối tượng. Nó cho phép một
lớp (class) có thể kế thừa các thuộc tính (attributes) và phương thức (methods) của một lớp khác. Lớp
kế thừa được gọi là lớp con (subclass), còn lớp bị kế thừa được gọi là lớp cha (superclass).
2.1. Định nghĩa Kế thừa
Lớp con có thể kế thừa tất cả các thuộc tính và phương thức từ lớp cha. Điều này giúp tái sử dụng mã
nguồn và tạo ra mối quan hệ cha-con giữa các lớp.
Trong hình 2, quan hệ Kế thừa được mô tả bằng Class Diagram. Trong, đó, Parent là superclass, Child
4
AI VIETNAM aivietnam.edu.vn
là subclass, được kết nối với bằng mũi tên có đầu tam giác rỗng, trỏ vào class Parent, ngụ ý rằng class
Parent là class cha của class Child.
Ví dụ dưới đây mô tả cú pháp khởi tạo class kế thừa. Trong đó, class cha là Parent được gọi trong dấu
ngoặc ngay khi class con là Child được định nghĩa. Phương thức __init__() của class cha cũng được
gọi ở class con thông qua hàm super().
1 class Parent :
2 def __init__ ( self , name ) :
3 self . name = name
4
5 def display ( self ) :
6 print ( f " Parent Name : { self . name } " )
7
8 class Child ( Parent ) :
9 def __init__ ( self , name , age ) :
10 super () . __init__ ( name ) # G ọ i h à m kh ở i t ạ o c ủ a l ớ p cha
11 self . age = age
12
13 def display ( self ) :
14 super () . display () # G ọ i ph ư ơ ng th ứ c c ủ a l ớ p cha
15 print ( f " Child Age : { self . age } " )
16
17 # T ạ o object c ủ a l ớ p Child
18 child = Child ( " Alice " , 20)
19 child . display ()
20
21 # Output :
22 # Parent Name : Alice
23 # Child Age : 20
24
5
AI VIETNAM aivietnam.edu.vn
a. Public members
Các public members có thể được truy cập từ bất kỳ đâu, cả bên trong và bên ngoài class. Mặc định,
tất cả các thuộc tính và phương thức trong Python đều là public.
1 class MyClass :
2 def __init__ ( self , value ) :
3 self . value = value
4
5 def display ( self ) :
6 print ( self . value )
7
8 obj = MyClass (10)
9 print ( obj . value ) # Truy c ậ p thu ộ c t í nh c ô ng khai
10 obj . display () # G ọ i ph ư ơ ng th ứ c c ô ng khai
11
b. Protected members
Các protected members chỉ nên được truy cập bên trong class và các lớp con của nó. Để khai báo một
member là protected, chúng ta sử dụng một dấu gạch dưới _ trước tên của thuộc tính hoặc phương
thức.
1 class MyClass :
2 def __init__ ( self , value ) :
3 self . _value = value # Protected attribute
4
5 def _display ( self ) : # Protected method
6 print ( self . _value )
7
8 class SubClass ( MyClass ) :
9 def show ( self ) :
10 self . _display () # Truy c ậ p ph ư ơ ng th ứ c đ ư ợ c b ả o v ệ t ừ l ớ p con
11
12 obj = SubClass (20)
13 obj . show () # Output : 20
14
b. Private members
Các private members chỉ có thể được truy cập bên trong class nơi chúng được định nghĩa. Để khai báo
một member là private, chúng ta sử dụng hai dấu gạch dưới __ trước tên của thuộc tính hoặc phương
thức.
6
AI VIETNAM aivietnam.edu.vn
1 class MyClass :
2 def __init__ ( self , value ) :
3 self . __value = value # Private attribute
4
5 def __display ( self ) : # Private method
6 print ( self . __value )
7
8 def public_method ( self ) :
9 self . __display () # Truy c ậ p ph ư ơ ng th ứ c ri ê ng t ư t ừ b ê n trong class
10
11 obj = MyClass (30)
12 obj . public_method () # Output : 30
13 # print ( obj . __value ) # L ỗ i : AttributeError
14 # obj . __display () # L ỗ i : AttributeError
15
2.3. Override
Override là một khái niệm quan trọng trong lập trình hướng đối tượng, cho phép một lớp con cung cấp
một triển khai cụ thể của một phương thức đã được định nghĩa trong lớp cha. Ghi đè phương thức cho
phép bạn thay đổi hoặc mở rộng hành vi của phương thức kế thừa từ lớp cha trong lớp con.
Để ghi đè một phương thức trong lớp con, bạn chỉ cần định nghĩa lại phương thức đó với cùng tên và
cùng tham số trong lớp con.
Trong ví dụ này, phương thức display() được ghi đè ở subclass Child.
1 class Parent :
2 def display ( self ) :
3 print ( " Display from Parent " )
4
5 class Child ( Parent ) :
6 def display ( self ) :
7 print ( " Display from Child " )
8
9 # T ạ o object t ừ l ớ p con
10 child = Child ()
11 child . display () # Output : Display from Child
12
7
AI VIETNAM aivietnam.edu.vn
1 class Parent :
2 def __init__ ( self , name ) :
3 self . name = name
4
5 def display ( self ) :
6 print ( f " Parent Name : { self . name } " )
7
8 class Child ( Parent ) :
9 def __init__ ( self , name , age ) :
10 super () . __init__ ( name )
11 self . age = age
12
13 def display ( self ) :
14 super () . display ()
15 print ( f " Child Age : { self . age } " )
16
17 # T ạ o object t ừ l ớ p con
18 child = Child ( " Alice " , 20)
19 child . display ()
20
21 # Output :
22 # Parent Name : Alice
23 # Child Age : 20
24
8
AI VIETNAM aivietnam.edu.vn
1 class Base1 :
2 def __init__ ( self ) :
3 self . str1 = " Base1 "
4 print ( " Base1 Initialized " )
5
6 class Base2 :
7 def __init__ ( self ) :
8 self . str2 = " Base2 "
9 print ( " Base2 Initialized " )
10
11 class Derived ( Base1 , Base2 ) :
12 def __init__ ( self ) :
13 Base1 . __init__ ( self )
14 Base2 . __init__ ( self )
15 print ( " Derived Initialized " )
16
17 def display ( self ) :
18 print ( self . str1 , self . str2 )
19
20 # T ạ o object t ừ l ớ p Derived
21 obj = Derived ()
22 obj . display ()
23
24 # Output :
25 # Base1 Initialized
26 # Base2 Initialized
27 # Derived Initialized
28 # Base1 Base2
29
9
AI VIETNAM aivietnam.edu.vn
1 class GrandParent :
2 def __init__ ( self , grandparent_name ) :
3 self . grandparent_name = grandparent_name
4
5 def dis pla y_g ran dp are nt ( self ) :
6 print ( f " GrandParent Name : { self . grandparent_name } " )
7
8 class Parent ( GrandParent ) :
9 def __init__ ( self , grandparent_name , parent_name ) :
10 super () . __init__ ( grandparent_name )
11 self . parent_name = parent_name
12
13 def display_parent ( self ) :
14 print ( f " Parent Name : { self . parent_name } " )
15
16 class Child ( Parent ) :
17 def __init__ ( self , grandparent_name , parent_name , child_name ) :
18 super () . __init__ ( grandparent_name , parent_name )
19 self . child_name = child_name
20
21 def display_child ( self ) :
22 print ( f " Child Name : { self . child_name } " )
23
24 # T ạ o object t ừ l ớ p con
25 child = Child ( " George " , " John " , " Alice " )
26 child . d isp lay _gr and par en t () # Output : GrandParent Name : George
27 child . display_parent () # Output : Parent Name : John
28 child . display_child () # Output : Child Name : Alice
29
10
AI VIETNAM aivietnam.edu.vn
1 class Parent :
2 def __init__ ( self , name ) :
3 self . name = name
4
5 def display ( self ) :
6 print ( f " Parent Name : { self . name } " )
7
8 class Child1 ( Parent ) :
9 def __init__ ( self , name , age ) :
10 super () . __init__ ( name )
11 self . age = age
12
13 def display ( self ) :
14 super () . display ()
15 print ( f " Child1 Age : { self . age } " )
16
17 class Child2 ( Parent ) :
18 def __init__ ( self , name , grade ) :
19 super () . __init__ ( name )
20 self . grade = grade
21
22 def display ( self ) :
23 super () . display ()
24 print ( f " Child2 Grade : { self . grade } " )
25
26 # T ạ o objects t ừ c á c l ớ p con
27 child1 = Child1 ( " Alice " , 20)
28 child2 = Child2 ( " Bob " , " A " )
29
30 child1 . display ()
31 # Output :
32 # Parent Name : Alice
33 # Child1 Age : 20
34
35 child2 . display ()
36 # Output :
37 # Parent Name : Bob
38 # Child2 Grade : A
39
11
AI VIETNAM aivietnam.edu.vn
6. Bài Tập
Câu hỏi 1: Khái niệm nào sau đây mô tả chính xác nhất về một class trong Python?
Câu hỏi 2: Trong sơ đồ class (class diagram), yếu tố nào sau đây không phải là thành phần của class?
Câu hỏi 3: Câu lệnh nào sau đây được sử dụng để định nghĩa một class trong Python?
Câu hỏi 4: Câu lệnh nào sau đây dùng để tạo một object từ class MyClass?
Câu hỏi 5: Phương thức đặc biệt nào được sử dụng để khởi tạo các thuộc tính của một object trong
Python?
a. __start__ c. __create__
b. __init__ d. __new__
a. Khả năng một class kế thừa các thuộc tính và phương thức từ một class khác
b. Khả năng một class thay đổi giá trị của các biến
Câu hỏi 7: Access modifier nào sau đây được sử dụng để chỉ ra một thuộc tính hoặc phương thức là
riêng tư (private) trong Python?
a. @ c. __
b. _ d. #
Câu hỏi 8: Điều nào sau đây là đúng về phương thức override trong Python?
12
AI VIETNAM aivietnam.edu.vn
a. Nó cho phép lớp con kế thừa phương thức từ lớp cha mà không cần thay đổi gì
b. Nó cho phép lớp con thay đổi hoặc mở rộng hành vi của phương thức kế thừa từ lớp cha
d. Nó yêu cầu lớp con phải gọi phương thức của lớp cha mà không được thay đổi
Câu hỏi 9: Loại kế thừa nào sau đây mô tả đúng khi một lớp con kế thừa từ nhiều lớp cha?
Câu hỏi 10: Trong Python, loại kế thừa nào xảy ra khi một lớp kế thừa từ một lớp cha, và lớp cha đó
lại kế thừa từ một lớp khác?
13