Thành viên dữ liáu: Là một biến class hoặc biến instance mà giữ dữ liáu đ°ợc liên kết với một lớp và các đái t°ợng cÿa nó.. T¿o các lớp trong Python Trong Python, lánh class đ°ợc sử dụ
Trang 1Uþ BAN NHÂN DÂN THÀNH PHà Hâ CHÍ MINH
TR¯âNG CAO ĐÀNG BÁCH KHOA NAM SÀI GÒN
GIÁO TRÌNH MÔN HàC/MÔ ĐUN: LÀP TRÌNH PYTHON NÂNG CAO
NGÀNH/ NGHÀ: TIN HàC ĀNG DĀNG
TRÌNH ĐÞ: CAO ĐÀNG
Ban hành kèm theo Quyết định số: 459/QĐ-NSG, ngày 31 tháng 08 năm 2022
của Hiệu trưởng Trường Cao Đẳng Bách Khoa Nam Sài Gòn
Tp.Hồ Chí Minh, năm 2022
Trang 3LâI GIàI THIÞU
Môn hác này thuộc khái kiến thāc chuyên môn nghề trong ch°¢ng trình đào t¿o ngành tin hác āng dụng há cao đẳng LÁp trình Python nâng cao là môn hác b¿t buộc trong ch°¢ng trình ngành Tin hác āng dụng trình độ cao đẳng
Nội dung giáo trình gãm 4 ch°¢ng:
- Ch°¢ng 1: LÁp trình h°ớng đái t°ợng
- Ch°¢ng 2: Làm viác với tÁp tin XML
- Ch°¢ng 3: Làm viác với dữ liáu JSON
- Ch°¢ng 4: Xây dựng āng dụng với c¢ sá dữ liáu
- Ch°¢ng 5: Sets và dictionaries
Trong quá trình biên so¿n chúng tôi đã kết hợp kinh nghiám giÁng d¿y trong nhiều năm cÿa nhóm tác giÁ với mong muán có thể giúp cho hác sinh 3 sinh viên dß dàng n¿m b¿t đ°ợc nội dung cÿa môn hác Mặc dù, rất cá g¿ng trong quá trình biên so¿n, nh°ng ch¿c ch¿n không thể tránh khßi những thiếu sót, vì vÁy, nhóm tác giÁ chúng tôi rất mong nhÁn đ°ợc ý kiến đóng góp cÿa b¿n đác để giáo trình ngày một hoàn thián h¢n
Tp.HCM , ngày 30 tháng 01 năm 2022
Tham gia biên so¿n
1 Chÿ biên: ThS Đào Thß Xuân H°ßng
2 &&&&
3 &&&&
&&&&&
Trang 4MĀC LĀC
Contents
Ch°¢ng 1 LÁp trình h°ớng đái t°ợng 1
1.1 Lớp và đái t°ợng 1
1.1.1 Một sá khái niám h°ớng đái t°ợng 1
1.1.2 T¿o các lớp trong Python 2
1.1.3 Phân biát giữa Đái t°ợng (Object) và Lớp (Class): 3
1.1.4 So sánh class cha và class con 4
1.1.5 T¿o Instance trong Python: 5
1.1.6 Thêm, xóa, hoặc sửa đổi các thuộc tính cÿa các lớp và đái t°ợng t¿i bất cā thßi điểm nào 7
1.1.7 Hÿy đái t°ợng (Trình dán rác) trong Python: 8
1.2 Ph°¢ng thāc: 10
1.2.1 Ghi đè ph°¢ng thāc trong Python: 11
1.2.2 N¿p chãng ph°¢ng thāc trong Python: 11
1.2.3 N¿p chãng toán tử trong Python 12
1.2.4 Àn dữ liáu (Data Hiding) trong Python 13
1.3 Kế thừa 14
1.3.1 Các kiểu kế thừa: 14
1.4 Lớp trừu t°ợng 18
1.4.1 Đa hình (Polymorphism) 18
1.4.2 Đóng gói (Encapsulation) 19
Bài tÁp có h°ớng d¿n 19
Bài tÁp 21
Ch°¢ng 2 Làm viác với tÁp tin XML 23
2.1 Giới thiáu XML 23
2.1.1 Khái niám XML 23
Trang 52.1.2 Đặc điểm cÿa file XML 24
2.1.3 ¯u điểm cÿa file xml 25
2.1.4 Nh°ợc điểm cÿa XML 26
2.1.5 Āng dụng phổ biến cÿa XML 26
2.1.6 Đác (read) file XML với BeautifulSoup 27
2.1.7 Các hàm cÿa BeautifulSoup th°ßng đ°ợc sử dụng để đác file XML nh°: 28 2.1.8 Module ElementTree 28
2.1.9 Đác (read) file XML với minidom 29
2.2 Cấu trúc tÁp tin XML với SAX APIs 30
2.2.1 Ph°¢ng thāc make_parser trong Python 31
2.2.2 Ph°¢ng Thāc Parse Trong Python 31
2.2.3 Ph°¢ng Thāc Parsestring Trong Python 32
2.2.4 Phân tích cú pháp XML với DOM APIs 34
Bài tÁp có h°ớng d¿n 35
Ch°¢ng 3 Làm viác với dữ liáu JSON 37
3.1 Giới thiáu JSON 37
3.2 Cấu trúc JSON 38
3.3 Xử lý Json với Python 39
3.3.1 Convert JSON trong Python 46
3.3.2 Convert object Python thành JSON 47
3.3.3 Format hiển thß 49
3.3.4 S¿p xếp key 49
3.4 Đác, xử lý dữ liáu JSON từ internet 49
3.5 Má, đác, ghi dữ liáu và tÁp tin jason 53
3.5.1 Ghi JSON vào một táp 53
3.5.2 Đác JSON từ một táp: 54
Bài tÁp có h°ớng d¿n 55
Trang 6Bài tÁp 61
Ch°¢ng 4 Xây dựng āng dụng với c¢ sá dữ liáu 62
4.1 Giới thiáu Há QTCSDL SQLite 62
4.1.1 Cách Cài Đặt Mysqldb 62
4.2 Python sqlite module APIs 63
4.2.1 Kết Nái Database Trong Python 63
4.2.2 T¿o BÁng Dữ Liáu Trong Python 63
4.2.3 Thêm dữ liáu trong python: 64
4.2.4 Đác dữ liáu trong python: 66
4.2.5 CÁp nhÁt dữ liáu trong Python 68
4.2.6 Xoá dữ liáu trong Python 69
4.2.7 Ng¿t kết nái tới database trong python 69
4.3 Xây dựng āng dụng 69
4.4 Bài tÁp 75
TÀI LIàU THAM KHÀO 77
Trang 7GIÁO TRÌNH MÔN LÀP TRÌNH PYTHON NÂNG CAO
Tên môn hác/mô đun: LÁp Trình Python Nâng Cao
Mã môn hác/mô đun: MH26
Vß trí, tính chất, ý nghĩa và vai trò cÿa môn hác/mô đun:
- Vß trí: : Môn hác này thuộc khái kiến thāc chuyên môn, b¿t buộc trong ch°¢ng trình đào t¿o bÁc cao đẳng ngành Tin hác āng dụng
- Tính chất: là môn hác b¿t buộc Môn hác nhÁm giúp sinh viên b°ớc đ¿u làm
quen với môi tr°ßng lÁp trình python, sinh viên thực hián nhiều ví dụ để n¿m rõ h¢n các kỹ thuÁt lÁp trình nhÁm xây dựng āng dụng ch¿y trên nhiều nền tÁng khác
nhau
- Ý nghĩa và vai trò cÿa môn hác/mô đun:
Ý nghĩa: Python hián là ngôn ngữ lÁp trình phổ biến nhất thế giới ¯u điểm nổi bÁt cÿa Python là dß hác, dß viết Không những thế, Python còn có một cộng đãng ng°ßi dùng lớn và há tháng th° vián mã nguãn má đã sộ giúp b¿n hoàn thành các dự án cÿa mình nhanh chóng và hiáu quÁ Cho dù đó là một dự án về phân tích dữ liáu, hác máy, xử lý Ánh, game, điều khiển thiết
bß, hoặc chỉ đ¢n giÁn là tự động hóa các tác vụ trên máy tính cÿa b¿n, thì g¿n nh° b¿n đều có thể tìm thấy các th° vián Python hỗ trợ
Vai trò: Môn hác này áp dụng cho sinh viên ngành Tin hác āng dụng trình
+ - Tổ chāc, xây dựng đ°ợc các ch°¢ng trình theo h°ớng đái t°ợng
+ - Làm viác đ°ợc với tÁp tin XML
+ - Làm viác đ°ợc với dữ liáu Jason
+ - Xây dựng đ°ợc āng dụng với c¢ sá dữ liáu
- VÁ năng lực tự chÿ và trách nhißm:
Rèn luyán lòng yêu nghề, t° thế tác phong công nghiáp, tính kiên trì, sáng t¿o trong công viác
Trang 8GVBS: Đào Thị Xuân Hường Trang 1
Ch°¡ng 1 Lập trình h°ớng đối t°ợng
Mục tiêu: Học xong chương này sinh viên có thể
- Tìm hiểu và sử dụng được hướng đối tượng trong ngôn ngữ python
Python là một ngôn ngữ lÁp trình h°ớng đái t°ợng Do đó với những b¿n đã hác qua C++ ch¿c rÁng đã khá quen thuộc với các khái niám về h°ớng đái t°ợng này Ch°¢ng này sẽ trình bày s¢ qua về các thuÁt ngữ liên quan đến h°ớng đái t°ợng cùng với các ví
dụ minh háa giúp b¿n dß hiểu h¢n về vấn đề đã trình bày
1.1 Lớp và đối t°ợng
1.1.1 Một số khái nißm h°ớng đối t°ợng
Lớp: Một nguyên m¿u đ°ợc đßnh nghĩa bái ng°ßi dùng cho một đái t°ợng mà đßnh nghĩa một tÁp hợp các thuộc tính mà xác đßnh rõ bất kỳ đái t°ợng nào cÿa lớp đó Các thuộc tính là các thành viên dữ liáu (các biến class và biến instance) và các ph°¢ng thāc đ°ợc truy cÁp thông qua toán tử dot (dấu chấm)
Biến class: Đây là một biến đ°ợc chia sẻ bái tất cÁ các instance (sự thể hián) cÿa một lớp Các biến class đ°ợc đßnh nghĩa bên trong một lớp nh°ng á bên ngoài bất cā ph°¢ng thāc nào cÿa lớp đó Biến class không đ°ợc sử dụng th°ßng xuyên nh° biến instance
Thành viên dữ liáu: Là một biến class hoặc biến instance mà giữ dữ liáu đ°ợc liên kết với một lớp và các đái t°ợng cÿa nó
N¿p chãng hàm (overloading): Là phép gán cÿa nhiều h¢n một hành vi tới một hàm
cụ thể Ho¿t động đ°ợc thực hián là đa d¿ng do các kiểu cÿa các đái t°ợng hoặc tham sá liên quan
Biến instance: Là một biến đ°ợc đßnh nghĩa bên trong một ph°¢ng thāc và chỉ thuộc
sá hữu cÿa instance hián t¿i cÿa một lớp đó
Tính kế thừa: Là viác truyền các đặc tr°ng cÿa một lớp cho các lớp khác mà kế thừa
từ lớp ban đ¿u
Instance: Là một đái t°ợng riêng cÿa một lớp nào đó Một đái t°ợng obj mà thuộc một lớp Circle là một instance (sự thể hián) cÿa lớp Circle
Trình khái t¿o: Là trình t¿o một sự thể hián cÿa một lớp
Ph°¢ng thāc: Một lo¿i hàm đặc biát mà đ°ợc đßnh nghĩa trong một ph¿n đßnh nghĩa lớp
Đái t°ợng: Một instance duy nhất cÿa một cấu trúc dữ liáu mà đ°ợc đßnh nghĩa bái lớp cÿa nó Một đái t°ợng gãm các thành viên dữ liáu (biến class và biến instance)
và các ph°¢ng thāc
N¿p chãng toán tử: Là phép gán cÿa nhiều h¢n một hàm cho một toán tử cụ thể
Trang 9GVBS: Đào Thị Xuân Hường Trang 2
1.1.2 T¿o các lớp trong Python
Trong Python, lánh class đ°ợc sử dụng để t¿o một lớp mới Tên cÿa lớp theo ngay sau
từ khóa class và đ°ợc theo sau bái dấu hai chấm, nh° sau:
def init (self, ten, hocphi):
self.ten = ten
self.hocphi = hocphi
Sinhvien.svCount += 1
def displayCount(self):
print "Tong so Sinh vien %d" % Sinhvien.svCount
def displaySinhvien(self):
print "Ten : ",self.ten, ", Hoc phi: ",self.hocphi
Biến svCount là một biến class có giá trß đ°ợc chia sẻ trong tất cÁ instance cÿa lớp Sinhvien này Biến này có thể đ°ợc truy cÁp d°ới d¿ng Sinhvien.svCount từ bên trong lớp hoặc bên ngoài lớp
Ph°¢ng thāc đ¿u tiên init () là một ph°¢ng thāc đặc biát, là constructor cÿa lớp hoặc ph°¢ng thāc khái t¿o mà Python gái khi b¿n t¿o một instance mới cÿa lớp này Khai báo các ph°¢ng thāc khác nh° các hàm thông th°ßng với exception là tham sá đ¿u tiên cho mỗi ph°¢ng thāc là self Python thêm tham sá self tới List cho b¿n; b¿n không c¿n bao nó khi b¿n gái các ph°¢ng thāc
Trang 10GVBS: Đào Thị Xuân Hường Trang 3
1.1.3 Phân bißt giữa Đối t°ợng (Object) và Lớp (Class):
Đái t°ợng (Object): có tr¿ng thái và hành vi
Lớp (Class): có thể đ°ợc đßnh nghĩa nh° là một template mô tÁ tr¿ng thái và hành vi mà lo¿i đái t°ợng cÿa lớp hỗ trợ Một đái t°ợng là một thực thể (instance) cÿa một lớp
# instantiate the Car class
toyota = Car("Toyota", "Đß", "Đián")
lamborghini = Car("Lamborghini", "Vàng", "Deisel")
porsche = Car("Porsche", "Xanh", "Gas")
# access the class attributes
print("Porsche là {}.".format(porsche. class .loaixe))
print("Toyota là {}.".format(toyota. class .loaixe))
print("Lamborghini cũng là {}.".format(lamborghini. class .loaixe))
# access the instance attributes
print("Xe {} có màu {} {} là nguyên liáu vÁn hành.".format( toyota.tenxe, toyota.mausac, toyota.nguyenlieu))
print("Xe {} có màu {} {} là nguyên liáu vÁn hành.".format(
Xe Toyota có màu Đß Đián là nguyên liáu vÁn hành
Xe Lamborghini có màu Vàng Deisel là nguyên liáu vÁn hành
Xe Porsche có màu Xanh Gas là nguyên liáu vÁn hành
Trang 11GVBS: Đào Thị Xuân Hường Trang 4
Ch°¢ng trình trên t¿o một lớp Car, sau đó xác đßnh các thuộc tính, đặc điểm cÿa đái t°ợng Chúng ta truy cÁp thuộc tính class bÁng cách sử dụng class .loaixe Các thuộc tính lớp đ°ợc chia sẻ cho tất cÁ các cá thể cÿa lớp.T°¢ng tự, chúng ta truy cÁp các thuộc tính instance bÁng cách sử dụng toyota.tenxe, toyota.mausac và toyota.nguyenlieu.Tuy nhiên, các thuộc tính instance là khác nhau cho mỗi cá thể cÿa một lớp
1.1.4 So sánh class cha và class con
Ví dā: T¿o mßt class con cho từng thành phần:
species = "Canis familiaris"
def init (self, name, age):
self.name = name
self.age = age
def str (self):
return f"{self.name} is {self.age} years old"
def speak(self, sound):
return f"{self.name} says {sound}"
L°u ý: Để t¿o một class con, b¿n t¿o class mới bÁng tên riêng cÿa nó, rãi nhÁp tên class
cha vào trong dấu ngoặc đ¢n Thêm dòng sau vào file dog.py để t¿o 3 class con mới cho class Dog:
Các phiên bÁn cÿa lớp con kế thừa tất cÁ các thuộc tính và ph°¢ng thāc cÿa lớp cha:
Trang 12GVBS: Đào Thị Xuân Hường Trang 5
'Jim says Woof'
Để xác đßnh class một đái t°ợng đ°ợc cung cấp thuộc về, b¿n có thể dùng type() sau:
Điểm c¿n ghi nhớ về class
Class đ°ợc t¿o bái class keyword (từ khóa)
Thuộc tính là biến thuộc về class
Thuộc tính luôn công khai và có thể đ°ợc truy cÁp bÁng toán tử (.)
Ví dụ: Myclass.Myattribute
1.1.5 T¿o Instance trong Python:
Để t¿o các instance cÿa một lớp, b¿n gái lớp này bái sử dụng tên lớp và truyền vào bất
kỳ tham sá nào mà ph°¢ng thāc init cÿa nó chấp nhÁn
Trang 13GVBS: Đào Thị Xuân Hường Trang 6
Truy cÁp các thußc tính trong Python: Truy cÁp các thuộc tính cÿa đái t°ợng bái sử
dụng toán tử dot (dấu chấm) với đái t°ợng Biến class sẽ đ°ợc truy cÁp bái sử dụng tên lớp nh° sau:
def init (self, ten, hocphi):
self.ten = ten
self.hocphi = hocphi
Sinhvien.svCount += 1
def displayCount(self):
print "Tong so Sinh vien %d" % Sinhvien.svCount
def displaySinhvien(self):
print "Ten : ",self.ten, ", Hoc phi: ",self.hocphi
"Lenh nay tao doi tuong dau tien cua lop Sinhvien"
Ten Hoang Hoc phi: 4000000
Ten Huong Hoc phi: 4500000
Trang 14GVBS: Đào Thị Xuân Hường Trang 7
Tong so Sinh vien 2
1.1.6 Thêm, xóa, hoặc sửa đổi các thuộc tính cÿa các lớp và đối t°ợng t¿i bất cā thời điểm nào
Ví dā:
sv1 tuoi = 21 # Them mot thuoc tinh 'tuoi'.
sv1 tuoi = 20 # Sua doi thuoc tinh 'tuoi'.
del sv1 tuoi # Xoa thuoc tinh 'tuoi'.
Thay vì sử dụng các lánh chính thāc để truy cÁp các thuộc tính, b¿n có thể sử dụng các hàm sau:
Hàm getattr(obj, name[, default]) : Để truy cÁp thuộc tính cÿa đái t°ợng
Hàm hasattr(obj,name) : Để kiểm tra xem một thuộc tính có tãn t¿i hay không
Hàm setattr(obj,name,value) : Để thiết lÁp một thuộc tính Nếu thuộc tính
không tãn t¿i, thì nó sẽ đ°ợc t¿o
Hàm delattr(obj, name) : Để xóa một thuộc tính
Ví dā:
hasattr(sv1,'tuoi') # Tra ve true neu thuoc tinh 'tuoi' ton tai
getattr(sv1, 'tuoi') # Tra ve gia tri cua thuoc tinh 'tuoi'
setattr(sv1,'tuoi',20)# Thiet lap thuoc tinh 'tuoi' la 20
delattr(sv1, 'tuoi') # Xoa thuoc tinh 'tuoi'
Các thuộc tính đã có sẵn cho lớp trong Python:
Mỗi lớp Python đều giữ các thuộc tính đã đ°ợc xây dựng sẵn sau và chúng có thể đ°ợc truy cÁp bái sử dụng toán tử dot (dấu chấm ) nh° bất kỳ thuộc tính khác:
dict : Là Dictionary chāa namespace cÿa lớp
doc : Đ°ợc sử dụng để truy cÁp Documentation String cÿa lớp nếu có
name : Là tên lớp
module : Là tên Module trong đó lớp đ°ợc đßnh nghĩa Thuộc tính là main trong chế độ t°¢ng tác
bases : Là một Tuple chāa các lớp c¢ sá
Vái láp Sinhvien trên, chúng ta sẽ thử truy cÁp tất cÁ các thußc tính này
class Sinhvien:
'Class co so chung cho tat ca sinh vien'
svCount = 0
Trang 15GVBS: Đào Thị Xuân Hường Trang 8
def init (self, ten, hocphi):
self.ten = ten
self.hocphi = hocphi
Sinhvien.svCount += 1
def displayCount(self):
print "Tong so Sinh vien %d" % Sinhvien.svCount
def displaySinhvien(self):
print "Ten : ",self.ten, ", Hoc phi: ",self.hocphi
print "Sinhvien. doc :",Sinhvien. doc
print "Sinhvien. name :",Sinhvien. name
print "Sinhvien. module :", Sinhvien. module
print "Sinhvien. bases :",Sinhvien. bases
print "Sinhvien. dict :",Sinhvien. dict
Sinhvien. dict : {' module ': ' main ', 'displayCount':
<function displayCount at 0xb7c84994>, 'svCount': 2,
'displaySinhvien': <function displaySinhvien at 0xb7c8441c>,
' doc ': 'Class co so chung cho tat ca sinh vien',
' init ': <function init at 0xb7c846bc>}
1.1.7 Hÿy đối t°ợng (Trình dọn rác) trong Python:
Python sẽ hÿy các đái t°ợng mà không c¿n đến nữa (các kiểu đã đ°ợc xây dựng sẵn hoặc instance cÿa lớp) một cách tự động để giÁi phóng không gian bộ nhớ Tiến trình này đ°ợc gái là Garbage Collection đ°ợc thực hián bái trình dán rác Garbage Collector Trình dán rác cÿa Python ch¿y trong khi thực thi ch°¢ng trình và đ°ợc kích ho¿t khi sá tham chiếu cÿa một đái t°ợng tiến về 0 Sá tham chiếu cÿa một đái t°ợng thay đổi khi
sá alias mà trß tới nó thay đổi
Sá tham chiếu cÿa một đái t°ợng tăng khi nó đ°ợc gán một tên mới hoặc đ°ợc đặt trong một container (chẳng h¿n nh° List, Tuple, Dictionary) Sá tham chiếu cÿa một đái t°ợng
Trang 16GVBS: Đào Thị Xuân Hường Trang 9
giÁm khi nó bß xóa với lánh del, tham chiếu cÿa nó đ°ợc tái gán, hoặc tham chiếu cÿa
nó thoát ra khßi ph¿m vi Khi sá tham chiếu cÿa một đái t°ợng tiến về 0, thì Python thu thÁp nó một cách tự động
Ví dā:
a = 40 # Tao doi tuong <40>
b = a # Tang so tham chieu cua <40>
c =[b] # Tang so tham chieu cua <40>
del a # Giam so tham chieu cua <40>
b = 100 # Giam so tham chieu cua <40>
c[0] =-1 # Giam so tham chieu cua <40>
Th°ßng thì chúng ta không chú ý khi trình dán rác hÿy một instance và giÁi phóng bộ nhớ Nh°ng một lớp có thể triển khai ph°¢ng thāc đặc biát là del (), đ°ợc gái là một destructor, mà đ°ợc triáu hãi khi instance là chuÁn bß đ°ợc hÿy Ph°¢ng thāc này
có thể đ°ợc sử dụng để xóa bất kỳ nguãn bộ nhớ nào đ°ợc sử dụng bái một instance
Ví dā: del () destructor này in tên lớp cÿa một instance mà chuÁn bß đ°ợc hÿy
class Point:
def init( self, x=0, y=0):
self.x = x
self.y = y
def del (self):
class_name = self. class . name
print class_name,"destroyed"
Trang 17GVBS: Đào Thị Xuân Hường Trang 10
K¿t quÁ
3083401324 3083401324 3083401324
Point destroyed
Chú ý: Một cách lý t°áng nhất là nên đßnh nghĩa các lớp trong file riêng biát, sau đó
nên import chúng trong file ch°¢ng trình chính bái sử dụng lánh import
def dungxe(self, mucdich):
return "{} đang dừng xe để {}".format(self.tenxe,mucdich)
def chayxe(self):
return "{} đang ch¿y trên đ°ßng".format(self.tenxe)
def nomay(self):
return "{} đang nổ máy".format(self.tenxe)
# instantiate the Car class
toyota = Car("Toyota", "Đß", "Đián")
lamborghini = Car("Lamborghini", "Vàng", "Deisel")
porsche = Car("Porsche", "Xanh", "Gas")
# call our instance methods
print(toyota.dungxe("n¿p đián"))
print(lamborghini.chayxe())
print(porsche.nomay())
kết quÁ
Toyota đang dừng xe để n¿p đián
Lamborghini đang ch¿y trên đ°ßng
Trang 18GVBS: Đào Thị Xuân Hường Trang 11
Porsche đang nổ máy
à ví dụ này, có ba ph°¢ng thāc là dungxe(), chayxe() và nomay() Chúng đ°ợc gái là ph°¢ng thāc instance bái vì chúng đ°ợc gái trên một đái t°ợng instance (toyota, lamborghini, porsche)
1.2.1 Ghi đè ph°¡ng thāc trong Python:
Chúng ta có thể ghi đè các ph°¢ng thāc cÿa lớp cha Một trong các lý do để thực hián viác ghi đè ph°¢ng thāc cÿa lớp cha là b¿n muán có tính năng khác biát hoặc đặc biát trong lớp con
Ví dā:
class Parent: # dinh nghia lop cha
def myMethod(self):
print 'Goi phuong thuc cua lop cha'
class Child(Parent):# dinh nghia lop con
def myMethod(self):
print 'Goi phuong thuc cua lop con'
c = Child() # instance cua lop con
c.myMethod() # lop con goi phuong thuc duoc ghi de
K¿t quÁ là:
Goi phuong thuc cua lop con
1.2.2 N¿p chồng ph°¡ng thāc trong Python:
BÁng d°ới đây liát kê một sá tính năng chung mà b¿n có thể ghi đè trong các lớp riêng
STT Ph°¡ng thāc, Miêu tÁ và Lãi gái m¿u
1 init ( self [,args ] )
Là constructor (với bất kỳ tham sá tùy ý nào)
Lßi gái m¿u : obj = tenLop(args)
Trang 19GVBS: Đào Thị Xuân Hường Trang 12
2 del ( self )
Là destructor, xóa một đái t°ợng
Lßi gái m¿u : del obj
3 repr ( self )
Biểu dißn chuỗi có thể °ớc l°ợng
Lßi gái m¿u : repr(obj)
4 str ( self )
Biểu dißn chuỗi có thể in đ°ợc
Lßi gái m¿u : str(obj)
5 cmp ( self, x )
So sánh đái t°ợng
Lßi gái m¿u : cmp(obj, x)
GiÁ sử chúng ta đã t¿o một lớp Vector để biểu dißn các vector hai chiều Điều gì xÁy ra khi sử dụng toán tử cộng (+) để cộng chúng? Có thể nói vui rÁng, lúc đó Python sẽ la hét vào mặt b¿n
Tuy nhiên, chúng ta có thể đßnh nghĩa ph°¢ng thāc add_ trong lớp cÿa b¿n để thực hián phép cộng vector và sau đó phép cộng vector sẽ vÁn hành nh° chúng ta mong đợi
1.2.3 N¿p chồng toán tử trong Python
return 'Vector (%d, %d)' %(self.a,self.b)
def add (self,other):
return Vector(self.a + other.a,self.b + other.b)
Trang 20GVBS: Đào Thị Xuân Hường Trang 13
1.2.4 Ẩn dữ lißu (Data Hiding) trong Python
Các thuộc tính cÿa một đái t°ợng có thể hoặc không thể là nhìn thấy với bên ngoài ph¿n đßnh nghĩa lớp B¿n c¿n đặc tên các thuộc tính với một tiền tá là hai dấu g¿ch d°ới, và sau đó các thuộc tính này sẽ không là nhìn thấy với bên ngoài
Traceback (most recent call last):
File "test.py", line 12,in <module>
print counter. secretCount
AttributeError:JustCounter instance has no attribute ' secretCount'
Trang 21GVBS: Đào Thị Xuân Hường Trang 14
Python bÁo vá các thành viên đó bÁng cách thay đổi nội t¿i tên để bao tên lớp Chúng
có thể truy cÁp các thuộc tính này d°ới d¿ng nh° doi_tuong._tenLop tenThuocTinh Nếu chúng ta thay thế dòng cuái cùng nh° sau:
1.3 Kế thừa
Kế thừa là khÁ năng cÿa một class để lấy hoặc kế thừa các thuộc tính từ một lớp khác Lớp d¿n xuất các thuộc tính đ°ợc gái là lớp d¿n xuất hoặc lớp con và lớp mà từ đó các thuộc tính đ°ợc d¿n xuất đ°ợc gái là lớp c¢ sá hoặc lớp cha Lợi ích cÿa viác thừa kế là:
+ Nó thể hián tát các mái quan há t¿i thế giới thực
+ Nó cung cấp khÁ năng tái sử dụng code Chúng ta không phÁi viết l¿i code nhiều l¿n Ngoài ra, nó cũng cho phép lÁp trình viên thêm nhiều tính năng h¢n vào class mà không c¿n chỉnh sửa nó
+ Về bÁn chất, nó có tính chất b¿c c¿u Điều đó có nghĩa nếu class B kế thừa class A khác, thì tất cÁ class phụ cÿa B sẽ tự động kế thừa A
Trang 22GVBS: Đào Thị Xuân Hường Trang 15
+ Thay vì b¿t đ¿u viết code cho một lớp mới, b¿n có thể t¿o một lớp bÁng viác kế thừa nó từ một lớp đã tãn t¿i tr°ớc đó bÁng cách liát kê lớp cha trong cặp dấu ngoặc đ¢n sau tên lớp mới
Lớp con kế thừa các thuộc tính cÿa lớp cha cÿa nó, và b¿n có thể sử dụng các thuộc tính nh° thể là chúng đã đ°ợc đßnh nghĩa trong lớp con đó Một lớp con cũng có thể ghi đè các thành viên dữ liáu và các ph°¢ng thāc từ lớp cha
Cú pháp:
Các lớp kế thừa đ°ợc khai báo khá giáng nh° lớp cha cÿa nó; tuy nhiên, một danh sách lớp c¢ sá để kế thừa từ đó đ°ợc cung cấp sau tên lớp mới
class Tenlopcon ( LopCha1 [, LopCha2 , ]):
'Phan documentation string cua Class la tuy y'
class_suite
Ví dā:
class Parent: # dinh nghia lop cha
parentAttr = 100
def init (self):
print "Goi constructor cua lop cha"
def parentMethod(self):
print 'Goi phuong thuc cua lop cha'
def setAttr(self, attr):
Parent.parentAttr = attr
def getAttr(self):
print "Thuoc tinh cua lop cha :",Parent.parentAttr
class Child(Parent):# dinh nghia lop con
def init (self):
print "Goi constructor cua lop con"
def childMethod(self):
print 'Goi phuong thuc cua lop con'
c = Child() # instance cua lop con
c.childMethod() # lop con goi phuong thuc cua no
Trang 23GVBS: Đào Thị Xuân Hường Trang 16
c.parentMethod() # goi phuong thuc cua lop cha
c.setAttr(200) # tiep tuc goi phuong thuc cua lop cha
c.getAttr() # tiep tuc goi phuong thuc cua lop cha
kết quÁ
Goi constructor cua lop con
Goi phuong thuc cua lop con
Goi phuong thuc cua lop cha
Thuoc tinh cua lop cha :200
Theo cách t°¡ng tự, ta có thể k¿ thừa mßt láp từ nhiÁu láp cha nh° sau:
class A: # dinh nghia lop A
def init (self, hangxe, tenxe, mausac):
# Lớp Car có 3 thuộc tính: tenxe, mausac, hang xe
self.hangxe = hangxe
self.tenxe = tenxe
self.mausac = mausac
Trang 24GVBS: Đào Thị Xuân Hường Trang 17
# ph°¢ng thāc
def chayxe(self):
print ("{} đang ch¿y trên đ°ßng".format(self.tenxe))
def dungxe(self, mucdich):
print ("{} đang dừng xe để {}".format(self.tenxe, mucdich))
# Lớp Toyota má rộng từ lớp Car
def init (self, hangxe, tenxe, mausac, nguyenlieu):
# Gái tới constructor cÿa lớp cha (Car)
# để gán giá trß vào thuộc tính cÿa lớp cha
super(). init (hangxe, tenxe, mausac)
self.nguyenlieu = nguyenlieu
# Kế thừa ph°¢ng thāc cũ
def chayxe(self):
print ("{} đang ch¿y trên đ°ßng".format(self.tenxe))
# Ghi đè (override) ph°¢ng thāc cùng tên cÿa lớp cha
def dungxe(self, mucdich):
print ("{} đang dừng xe để {}".format(self.tenxe, mucdich))
print ("{} ch¿y bÁng {}".format(self.tenxe, self.nguyenlieu))
# Bổ sung thêm thành ph¿n mới
def nomay(self):
print ("{} đang nổ máy".format(self.tenxe))
toyota1 = Toyota("Toyota", "Toyota Hilux", "Đß", "Đián")
toyota2 = Toyota("Toyota", "Toyota Yaris", "Vàng", "Deisel")
toyota3 = Toyota("Toyota", "Toyota Vios", "Xanh", "Gas")
toyota1.dungxe("n¿p đián")
toyota2.chayxe()
toyota3.nomay()
K¿t quÁ trÁ vÁ
Toyota Hilux đang dừng xe để n¿p đián
Toyota Hilux ch¿y bÁng Đián
Toyota Yaris đang ch¿y trên đ°ßng
Toyota Vios đang nổ máy
Ch°¡ng trình này t¿o hai láp k¿ thừa: láp cha Car và láp con Toyota
Trang 25GVBS: Đào Thị Xuân Hường Trang 18
Khai báo constructor mới để gán giá trß vào thuộc tính cÿa lớp cha Hàm super() đāng tr°ớc ph°¢ng thāc init để gái tới nội dung init cÿa Car
Class Toyota kế thừa hàm chayxe() và dungxe() cÿa class Car đãng thßi sửa đổi một hành vi thể hián á ph°¢ng thāc dungxe() Sau đó lớp con bổ sung thêm thành ph¿n mới là nomay() để má rộng kế thừa
def dungxe(self):
print("Toyota dừng xe để n¿p đián")
def nomay(self):
print("Toyota nổ máy bÁng hộp sá tự động")
def dungxe(self):
print("Porsche dừng xe để b¢m xăng")
def nomay(self):
print("Porsche nổ máy bÁng hộp sá c¢")
Trang 26GVBS: Đào Thị Xuân Hường Trang 19
à ví dụ này, chúng ta vừa t¿o hai lớp Toyota và Porsche, cÁ hai lớp đều có ph°¢ng thāc dungxe() Tuy nhiên hàm cÿa chúng khác nhau Ta sử dụng tính đa hình để t¿o hàm chung cho hai lớp, đó là kiemtra_dungxe() Tiếp theo, chúng ta truyền đái t°ợng toyota
và porsche vào hàm vừa t¿o, và ta lấy đ°ợc kết quÁ nh° này:
def init (self):
self. maxprice = 900
def sell(self):
print("Giá bán sÁn phÁm là: {}".format(self. maxprice))
def setMaxPrice(self, price):
Trang 27GVBS: Đào Thị Xuân Hường Trang 20
Bài tÁp 3 Viết ch°¢ng trình quÁn lý các CD(Công Đoàn) nh° sau
Ng°ßi dùng l¿n l°ợt nhÁp thông tincÿa các CD, ch°¢ng trình sẽ quÁn lý thông tin các
CD này và in ra danh sách các CD kèm theo tổng sá tiền cÿa các CD
from thuvien.XL_CD import *
tt=1
DSCD=[]
while tt==1:
Trang 28GVBS: Đào Thị Xuân Hường Trang 21
TenCD=input('Nhap Ten CD\t')
TenCaSi=input('Nhap Ten ca si\t')
SoBaiHat=int(input('Nhap Bai hat\t'))
GiaTien=eval(input('Nhap Gia tien\t'))
Giao dßch tiền tá: Mã giao dßch, ngày giao dßch (ngày/tháng/năm), tÿ giá (cũng là đ¢n giá), sá l°ợng, lo¿i tiền tá có 3 lo¿i:USD, EUR, AUD, lo¿i giao dßch mua/bán Thành tiền đ°ợc tính nh° sau:
Nếu lo¿i giao dßch là <mua=thì: thành tiền = sá l°ợng * tÿ giá
Nếu lo¿i giao dßch là <bán= thì: thành tiền = (sá l°ợng * tÿ giá)* 1.05
Yêu cầu:
Trang 29GVBS: Đào Thị Xuân Hường Trang 22
1 T¿o lớp GiaoDichvới các thuộc tính và ph°¢ng thāc chung (giao dßch vàng cũng là giao dßch)
2 T¿o lớp GiaoDichTienTekế thừa từ lớp GiaoDichvới các thuộc tính riêng và ph°¢ng thāc c¿n thiết
3 NhÁp xuất danh sách các giao dßch
4 Tính tổng sá l°ợng cho từng lo¿i
5 Tính tổng thànhtiền cho từng lo¿i
Bài tÁp 2 Tính chu vi & dißntích các hình (abstract)
Viết ch°¢ng trình tính chu vi và đián tích cÿa một sá hình nh° sau:
+ Hình tròn
+ Hình chữ nhÁt
+ Hình tam giác
Bài tÁp 3 Viết ch°¢ng trình quÁn lý sinh viên trong Python Mỗi đái t°ợng sinh viên
có các thuộc tính sau: id, tên, giới tính, tuổi, điểm toán, điểm lý, điểm hóa, điểm trung bình và hác lực
Id là mã sinh viên tự động tăng
Điểm trung bình là giá trß trung bình cÿa 3 môn toán, lý và hóa
Hác lực đ°ợc tính nh° sau:
Gißi: nếu điểm trung bình lớn h¢n hoặc bÁng 8
Khá: nếu điểm trung bình nhß h¢n 8 và lớn h¢n hoặc bÁng 6.5
Trung Bình: nếu điểm trung bình nhß h¢n 6.5 và lớn h¢n hoặc bÁng 5
Yếu: nếu điểm trung bình nhß h¢n 5
Yêu c¿u: t¿o ra một menu với các chāc năng sau:
1 Thêm sinh viên
2 CÁp nhÁt thông tin sinh viên bái ID
3 Xóa sinh viên bái ID
4 Tìm kiếm sinh viên theo tên
5 S¿p xếp sinh viên theo điểm trung bình (GPA)
6 S¿p xếp sinh viên theo tên
6 S¿p xếp sinh viên theo ID
8 Hiển thß danh sách sinh viên
Trang 30GVBS: Đào Thị Xuân Hường Trang 23
Ch°¡ng 2 Làm vißc với tập tin XML
Mục tiêu: Học xong chương này sinh viên có thể
- Tìm hiểu và sử dụng được tập tin XML
2.1 Giới thißu XML
XML (Extensible Markup Language) gái là ngôn ngữ đánh dấu má rộng XML th°ßng đ°ợc sử dụng để tổ chāc, l°u trữ, truyền gửi dữ liáu giữa các há tháng khác nhau XML đ°ợc xây dựng dựa trên một tÁp hợp các quy t¿t để mã hóa dữ liáu thành một document với đßnh d¿ng cụ thể GiÁ sử, chúng ta có 1 file items.xml có nội dung nh° bên d°ới:
items.xml
< data >
< items >
< item name =" item1 " price =" 5 ">book</ item >
< item name =" item2 " price =" 15 ">chair</ item >
< item name =" item3 " price =" 20 ">window</ item >
</ items >
</ data >
File items.xml đ¢n giÁn gãm các thẻ (tag) lãng nhau Trong đó, mỗi thẻ item có thuộc tính name và price Chúng ta sẽ sử dụng file items.xml cho các ví dụ đác file XML trong bài này
Viác đác và phân tích file XML th°ßng đ°ợc gái là phân tích cú pháp (parsing) Trong Python, chúng ta có thể parsing file XML bÁng cách th° vián:
Trang 31GVBS: Đào Thị Xuân Hường Trang 24
API sẽ trÁ kết quÁ về d¿ng XML để các há tháng khác nhau có thể nói chuyán với nhau đ°ợc
Nếu mô tÁ một cách đ¢n giÁn h¢n thì XML giáng nh° một máy phiên dßch ngôn ngữ giữa các há tháng với nhau vÁy Ngoài chāc năng thông dßch, nó còn giúp đ¢n giÁn hóa
dữ liáu giữa các platform và há tháng khác nhau XML cũng có thể đ°ợc dùng nh° một kho l°u trữ các dữ liáu đã trao đổi
Ví dụ: Có 2 āng dụng, 1 āng dụng đ°ợc xây dựng dựa trên ngôn ngữ lÁp trình Java, āng dụng còn l¿i thì đ°ợc t¿o nên từ Php VÁy thì hai āng dụng này hoàn toàn không thể kết nái với nhau đ°ợc XML xuất hián nh° một c¿u nái mang đến ngôn ngữ chung cÿa hai āng dụng này giúp chúng thực hián t°¢ng tác với nhau
2.1.2 Đặc điểm cÿa file XML
XML đ°ợc dùng cho những lo¿i dữ liáu có cấu trúc XML có cấu t¿o trực quan khá giáng với HTML, nh°ng v¿n khác nhau á nhiều điểm Có thể nói, XML là c¿u nái để đ°a HTML đến với XHTML
Tuy XML tãn t¿i nh° một d¿ng văn bÁn nh°ng nó không dùng để đác, nó chỉ giúp các
há tháng khác nhau có thể thấu hiểu l¿n nhau Khi ta nh¿c đến đßnh nghĩa đác file XML trong Java thì có nghĩa là dùng XML để mã hóa Java theo ngôn ngữ đánh dấu, chā không phÁi má văn bÁn XML ra rãi đác nó lên
VÁy đßnh d¿ng XML là gì? XML có nhiều cách để đßnh d¿ng khác nhau, d°ới đây là một sá đßnh d¿ng phổ biến mà b¿n có thể biết:
Trang 32GVBS: Đào Thị Xuân Hường Trang 25
RSS và ATOM: Chúng đều dùng để mô tÁ cách làm thế nào mà āng dụng đác xử lý đ°ợc nguãn cấp web
Microsoft NET: Há tháng này sẽ sử dụng XML cho các file cấu hình cÿa nó
Các phiên bÁn kể từ Microsoft Office 2007: Chúng sử dụng XML làm c¢ sá cho cấu trúc tài liáu Ký hiáu <X= trong đßnh d¿ng tài liáu Word DOCX cũng xuất phát từ đây Ngoài ra, XML cũng đ°ợc āng dụng trong Excel (file XLSX) và PowerPoint (file PPTX)
2.1.3 ¯u điểm cÿa file xml
+ KhÁ năng đác:
Tuy file XML không đ°ợc dùng để đác trực tiếp nh°ng nó v¿n vô cùng hữu ích đái với các nhà phân tích dữ liáu Tr°ớc mỗi thông tin quan tráng trong XML đều có tag name đ¿y đÿ với ký tự text thân thián, phù hợp với khÁ năng đác hiểu cÿa con ng°ßi chā không chỉ là ngôn ngữ máy tính khô khan Các thông tin đ°ợc s¿p xếp gán gàng và có
tổ chāc nên b¿n có thể nhanh chóng tra cāu khi c¿n thiết Ngoài ra, ngôn ngữ XML t°¢ng thích với h¿u hết các lo¿i dữ liáu, t¿o nên sự trao đổi nhanh chóng giữa máy tính
Các file XML mang tính độc lÁp Điều này có nghĩa là b¿n có thể tùy ý di chuyển chúng
và sử dụng á bất cā vß trí, điều kián nào Điều kián c¿n thiết để sử dụng XML là phÁi có ph¿n mềm xử lý Khi đó b¿n có thể l°u trữ và truyền đi dữ liáu cÿa mình
+ KhÁ năng tùy chỉnh:
XML là một lo¿i ngôn ngữ đánh dấu má rộng Vì thế nó cho phép ng°ßi dùng thoÁi mái t¿o các tag riêng hoặc sử dụng các tag có sẵn từ ng°ßi khác Điều kián để sử dụng tag cÿa ng°ßi khác cũng rất đ¢n giÁn B¿n chỉ c¿n đÁm bÁo có ngôn ngữ tự nhiên cÿa domain
và chúng sá hữu đ¿y đÿ các tính năng c¿n thiết Sá l°ợng tag đ°ợc t¿o cũng sẽ không
bß giới h¿n trong XML
Trang 33GVBS: Đào Thị Xuân Hường Trang 26
2.1.4 Nh°ợc điểm cÿa XML
Có một sá tr°ßng hợp ghi nhÁn sự sai sót trong quá trình truyền thông tin cÿa XML Tuy nhiên khÁ năng xÁy ra chỉ khoÁng 5-7%, rất thấp Dù vÁy để ch¿c ch¿n b¿n cũng nên có ph°¢ng pháp rà soát l¿i thông tin sau khi tiến hành sử dụng XML
2.1.5 Āng dụng phổ biến cÿa XML
+ Xuất bÁn web:
XML đ°ợc sử dụng nh° một công cụ thiết kế web Các dữ liáu đ°ợc t¿o ra và l°u trữ trong XML Ng°ßi dùng có thể sử dụng chúng trên nhiều máy khác nhau Để chuyển đổi XML thành những bá cục khác, ví dụ nh° HTML cho các trang web, b¿n chỉ c¿n sử dụng các bộ xử lý chuyển đổi đ¢n giÁn Nhà phát triển web sẽ sử dụng XML nh° một công cụ hỗ trợ cho ho¿t động chỉnh sửa và thao tác nội dung cho các trang web
+ Tác vụ web
XML giúp tái °u hóa khÁ năng tìm kiếm và tự động hóa các tác động trên web Nó cho phép ng°ßi dùng tìm kiếm nhanh chóng một thông tin nào đó với các kết quÁ rất chuÁn xác Ví dụ, nếu b¿n tìm kiếm cụm từ Black Widow (một loài nhán) qua HTML, kết quÁ
Trang 34GVBS: Đào Thị Xuân Hường Trang 27
trÁ về sẽ có cÁ Black 3 màu đen và Widow 3 góa phụ Nh°ng nếu b¿n tìm kiếm qua XML, kết quÁ đ°ợc thu gán l¿i, thông tin cô đáng và chính xác h¢n
+ Āng dụng chung
Không chỉ có thể sử dụng cho web, XML phù hợp với cÁ các ph¿n mềm, há tháng khác nhau Nó t¿o nên sự liên kết và làm thân thián hóa ph¿n thông tin cho ng°ßi dùng Vì thế XML đ°ợc các lÁp trình viên, kỹ s° xây dựng và các kiến trúc s° sử dụng phổ biến hÁng ngày
2.1.6 Đọc (read) file XML với BeautifulSoup
Th° vián BeautifulSoup hỗ trợ HTML parser (lxml) giúp đác file xml Để sử dụng lxml parser, chúng ta c¿n cài đặt th° vián này với câu lánh sau:
# install beautifulsoup pip install beautifulsoup4
#install lmxl parser pip install lxml
Các b¿n có thể đác l¿i bài Cài đặt Python và môi tr°ßng lÁp trình với Visual Studio Code
để biết cách cài đặt các th° vián Python trong Visual Studio Code
Để đác file xml với lxml, chúng ta thực hián 2 b°ớc:
B°ớc 1 Tìm các thẻ (tag) trong xml,
B°ớc 2 Rút trích dữ liáu từ các thẻ (tag)
Ví dā:
from bs4 import BeautifulSoup
# reading data in items.xml
# using find() to get a tag with specified attribute
bs_name = bs_data.find('item', {'name':'item1'})
print(bs_name)
Trang 35GVBS: Đào Thị Xuân Hường Trang 28
# extracting the text stored in a tag
2.1.7 Các hàm cÿa BeautifulSoup th°ờng đ°ợc sử dụng để đọc file XML nh°:
Hàm find_all(): tìm tất cÁ các thẻ (tag) đ°ợc chỉ đßnh
Hàm find() :tìm một thẻ đ¿u tiên phù hợp với yêu c¿u
Hàm get_text(): lấy ra text cÿa thẻ
Hàm get() :lấy ra giá trß cÿa thuộc tính cÿa một thẻ
Ghi chú: Có thể tìm hiểu thêm cách sử dụng BeautifulSoup t¿i Beautiful Soup
Documentation
2.1.8 Module ElementTree
Cung cấp rất nhiều công cụ để thao tác với file XML Module ElementTree đ°ợc xây dựng sẵn trong Python nên chúng ta không c¿n cài đặt bất kỳ th° vián nào thêm để sử dụng ElementTree
Tổ chāc lữu trữ dữ liáu cÿa file XML là một đßnh d¿ng dữ liáu phân cấp nên viác biểu dißn nó bÁng cây sẽ dß dàng h¢n rất nhiều Module ElementTree cung cấp các ph°¢ng thāc để biểu dißn toàn bộ tài liáu XML d°ới d¿ng một cây duy nhất Viác này rất phù hợp trong thao tác với file XML
Module ElementTree cung cấp hàm ElementTree.parse() để b¿t đ¿u phân tích cú pháp cÿa file XML Sau đó, hàm getroot() giúp lấy thẻ root trong file XML Thẻ root sẽ có các thẻ con đ°ợc đánh index b¿t đ¿u từ 0 Các thẻ con sẽ có thuộc tính attrib để giúp truy xuất các thuộc tính cÿa một thẻ Đác (read) file XML với ElementTree
Ví dā:
# importing element tree
Trang 36GVBS: Đào Thị Xuân Hường Trang 29
2.1.9 Đọc (read) file XML với minidom
Module minidom đ°ợc tích hợp sẵn trong Python Chúng ta chỉ c¿n import xml.dom.minidom để sử dụng module minidom Module này hỗ trợ hàm parse() để đác file XML Với minidom, mỗi thẻ (tag) sẽ đ°ợc xem là một đái t°ợng (object) Chúng ta
có thể truy cÁp các thuộc tính (attribute) và văn bÁn (text) cÿa một thẻ bÁng cách truy cÁp các thuộc tính cÿa đái t°ợng
Ví dā:
from xml.dom import minidom
# parse file items.xml
file = minidom.parse('items.xml')
# use getElementsByTagName() to get tags
items = file.getElementsByTagName('item')
# one specific item attribute
print('Value of attribute name of item #2:')
Trang 37GVBS: Đào Thị Xuân Hường Trang 30
print(items[1].attributes['name'].value)
# all attributes of item tags
print('\nAll values of attribute name:')
for elem in items:
# all items data
print('\nAll item data:')
for elem in items:
print(elem.firstChild.data)
K¿t quÁ
Value of attribute name of item #2: item2
All values of attribute name: item1 item2 item3 Data of item: chair chair
All item data: book chair window
Th° vián Python chuÁn cung cấp các Interface hữu ích để làm viác với XML Hai APIs c¢ bÁn và đ°ợc sử dụng nhiều nhât là SAX và DOM SAX (viết t¿t cÿa Simple API for XML) là read-only trong khi DOM (viết t¿t cÿa Document Object Model) cho phép t¿o các thay đổi tới XML file
Ch°¢ng này sẽ giới thiáu về cÁ hai Interface này, nh°ng tr°ớc hết, chúng ta t¿o một XML file đ¢n giÁn có tên là movies.xml để làm input:
2.2 Cấu trúc tập tin XML với SAX APIs
Để t¿o riêng một ContentHandler là lớp con cÿa xml.sax.ContentHandler
ContentHandler cÿa b¿n sẽ xử lý các tag cụ thể và các thuộc tính cÿa XML Một đái t°ợng ContentHandler cung cấp các ph°¢ng thāc để xử lý các sự kián parsing khác nhau
Trang 38GVBS: Đào Thị Xuân Hường Trang 31
Ph°¢ng thāc startDocument và endDocument đ°ợc gái t¿i ph¿n b¿t đ¿u và ph¿n cuái cÿa XML file Ph°¢ng thāc characters(text) để truyền dữ liáu ký tự cÿa XML thông qua tham sá text
Đái t°ợng ContentHandler đ°ợc gái t¿i ph¿n b¿t đ¿u và ph¿n cuái cÿa mỗi ph¿n tử Nếu Parser không trong namespace mode, thì các ph°¢ng thāc startElement(tag, thuoc_tinh)
và endElement(tag) đ°ợc gái; nếu không thì, các ph°¢ng thāc t°¢ng āng startElementNS và endElementNS đ°ợc gái à đây, tham sá tag là thẻ và thuoc_tinh là một đái t°ợng Attributes
Chúng ta tìm hiểu một sá ph°¢ng thāc quan tráng sau để hiểu rõ tiến trình xử lý h¢n:
2.2.1 Ph°¡ng thāc make_parser trong Python
Ph°¢ng thāc sau t¿o một đái t°ợng parser mới và trÁ về nó Đái t°ợng parser đã đ°ợc t¿o này sẽ là kiểu parser đ¿u tiên mà há tháng tìm thấy
xml.sax.make_parser( [parser_list] )
Tham sá parser_list là tùy ý, bao gãm một danh sách các parser để sử dụng, tất cÁ phÁi triể Ph°¢ng thāc parse trong Python
Ph°¢ng thāc này t¿o một SAX parser và sử dụng nó để phân tích cú pháp một tài liáu.n khai ph°¢ng thāc make_parser
xml.sax.parse( xmlfile, contenthandler[, errorhandler])
Chi ti¿t tham sß:
xmlfile: Đây là tên cÿa XML file để đác từ đó
contenthandler: Đây phÁi là một đái t°ợng ContentHandler
errorhandler: Nếu đ°ợc xác đßnh, thì nó phÁi là một đái t°ợng SAX ErrorHandler
2.2.2 Ph°¡ng Thāc Parse Trong Python
Ph°¢ng thāc này t¿o một SAX parser và sử dụng nó để phân tích cú pháp một tài liáu
xml.sax.parse( xmlfile, contenthandler[, errorhandler])
Chi tiết tham sá:
Xmlfile: Đây là tên cÿa XML file để đác từ đó
Contenthandler: Đây phÁi là một đái t°ợng contenthandler
Errorhandler: Nếu đ°ợc xác đßnh, thì nó phÁi là một đái t°ợng SAX
errorhandler
Trang 39GVBS: Đào Thị Xuân Hường Trang 32
2.2.3 Ph°¡ng Thāc Parsestring Trong Python
Ph°¢ng thāc này cũng dùng để t¿o một SAX parser và để phân tích cú pháp XML string
đã cho
xml.sax.parseString(xmlstring, contenthandler[, errorhandler])
Chi ti¿t vÁ tham sß:
xmlstring: Là tên cÿa XML string để đác từ đó
contenthandler: PhÁi là một đái t°ợng ContentHandler
errorhandler: Nếu đ°ợc xác đßnh, thì nó phÁi là một đái t°ợng SAX
# Goi khi mot phan tu bat dau
def startElement(self, tag, attributes):
self.CurrentData = tag
if tag == "movie":
print "*****Phim Bo*****"
title = attributes["title"]
print "Ten Phim:", title
# Goi khi mot phan tu ket thuc
Trang 40GVBS: Đào Thị Xuân Hường Trang 33
def endElement(self, tag):
if self.CurrentData == "type":
print "The loai:", self.type
elif self.CurrentData == "format":
print "Dinh dang:", self.format
elif self.CurrentData == "year":
print "Nam:", self.year
elif self.CurrentData == "rating":
print "Rating:", self.rating
elif self.CurrentData == "stars":
print "Dien vien:", self.stars
elif self.CurrentData == "description":
print "Gioi thieu:", self.description
self.CurrentData = ""
# Goi khi mot ky tu duoc doc
def characters(self, content):