giáo trình lập trình python nâng cao nghề tin học ứng dụng cao đẳng

84 0 0
Tài liệu đã được kiểm tra trùng lặp
giáo trình lập trình python nâng cao nghề tin học ứng dụng cao đẳng

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

 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 1

Uþ BAN NHÂN DÂN THÀNH PHà Hâ CHÍ MINH

TR¯âNG CAO ĐÀNG BÁCH KHOA NAM SÀI GÒN

Trang 3

Lâ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 4

MĀC LĀCContents

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

Trang 5

2.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°:282.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 6

Bà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 7

GIÁ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 độ Cao đẳng

Māc tiêu cÿa môn hác/mô đun: - VÁ ki¿n thāc:

+ N¿m với kiến thāc lÁp trình h°ớng đái t°ợng với python

- VÁ kỹ năng:

+ - 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 8

GVBS: Đà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 9

GVBS: Đà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:

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 10

GVBS: Đà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( lamborghini.tenxe, lamborghini.mausac,lamborghini.nguyenlieu))

print("Xe {} có màu {} {} là nguyên liáu vÁn hành.".format( porsche.tenxe, porsche.mausac, porsche.nguyenlieu))

K¿t quÁ trÁ vÁ sẽ là:

Porsche là Ô tô Toyota là Ô tô

Lamborghini cũng là Ô tô

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 11

GVBS: Đà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 12

GVBS: Đà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 13

GVBS: Đà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:

print "Tong so Sinh vien %d" % Sinhvien.svCount

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" sv1 = Sinhvien("Hoang", 4000000)

"Lenh nay tao doi tuong thu hai cua lop Sinhvien" sv2 = Sinhvien("Huong",4500000)

print "Tong so Sinh vien %d" % Sinhvien.svCount

K¿t quÁ:

Ten Hoang Hoc phi: 4000000 Ten Huong Hoc phi: 4500000

Trang 14

GVBS: Đà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 15

GVBS: Đà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 Kết quÁ:

Sinhvien. doc : Class co so chung cho tat ca sinh vien Sinhvien. name : Sinhvien

Sinhvien. module : main Sinhvien. bases : ()

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 16

GVBS: Đà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"

pt1 = Point()pt2 = pt1 pt3 = pt1

print id(pt1), id(pt2), id(pt3)# in id cua doi tuong

del pt1 del pt2 del pt3

Trang 17

GVBS: Đà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 18

GVBS: Đà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 19

GVBS: Đà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 Ví dā:

class Vector:

def init (self, a, b): self.a = a

self.b = b def str (self):

return 'Vector (%d, %d)' %(self.a,self.b) def add (self,other):

return Vector(self.a + other.a,self.b + other.b)

Trang 20

GVBS: Đào Thị Xuân Hường Trang 13

v1 = Vector(2,10)v2 = Vector(5,-2)print v1 + v2

K¿t quÁ là:

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

Ví dā:

class JustCounter: secretCount = 0 def count(self):

self. secretCount += 1 print self. secretCount counter = JustCounter()counter.count()

print counter. secretCount

K¿t quÁ là:

1 2

Traceback (most recent call last): File "test.py", line 12,in <module> print counter. secretCount

AttributeError:JustCounter instance has no attribute ' secretCount'

Trang 21

GVBS: Đà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:

print counter._JustCounter secretCountKết quÁ là:

1 2 2

à ví dụ này, khái t¿o class Computer, sử dụng init () để l°u trữ giá bán tái đa cÿa máy tính Nh°ng sau khi sử dụng, nếu chúng ta có nhu c¿u sửa đổi giá, tuy nhiên không thể thay đổi theo cách bình th°ßng vì Python đã coi maxprice là thuộc tính private VÁy nên để thay đổi giá trß, ta sử dụng hàm setter setMaxPrice()

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

+ Kế thừa theo thā bÁc: Kế thừa á cấp độ thā bÁc cho phép nhiều lớp d¿n xuất kế thừa các thuộc tính từ một lớp cha

+ Đa kế thừa: Kế thừa nhiều cấp cho phép một lớp d¿n xuất kế thừa các thuộc tính từ nhiều lớp c¢ sá

Trang 22

GVBS: Đà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

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 23

GVBS: Đà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 24

GVBS: Đà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()

Trang 25

GVBS: Đà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¢")

# common interface

def kiemtra_dungxe(car): car.dungxe()

# instantiate objects

toyota = Toyota() porsche = Porsche()

# passing the object

kiemtra_dungxe(toyota) kiemtra_dungxe(porsche)

Trang 26

GVBS: Đà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:

Toyota dừng xe để n¿p đián Porsche dừng xe để b¢m xăng

1.4.2 Đóng gói (Encapsulation)

Sử dụng OOP trong Python, chúng ta có thể h¿n chế quyền truy cÁp vào tr¿ng thái bên trong cÿa đái t°ợng Điều này ngăn chặn dữ liáu bß sửa đổi trực tiếp, đ°ợc gái là đóng gói Trong Python, chúng ta biểu thß thuộc tính private này bÁng cách sử dụng dấu g¿ch d°ới làm tiền tá: <_= hoặc < <

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):

self. maxprice = price c = Computer()

Màn hình hiển thß k¿t quÁ:

Giá bán sÁn phÁm là: 900 Giá bán sÁn phÁm là: 900 Giá bán sÁn phÁm là: 1000

Bài tập có h°ớng dẫn

Bài tÁp 1 GiÁi ph°¢ng trình bÁc nhất

from thuvien.XL_PhuongTrinhBacNhat import *

a,b=eval(input('Nhap he so a,b: '))

Trang 27

GVBS: Đào Thị Xuân Hường Trang 20

xlPTBachNhat = XL_PhuongTrinhBachNhat(a,b) Nghiem=xlPTBachNhat.TimNghiem()

print(XL_PTBHai.a)

setattr(XL_PTBHai,'a',123)

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 28

GVBS: Đà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'))

cd = XL_CD(TenCD,TenCaSi,SoBaiHat,GiaTien) DSCD.append(cd)

tt=int(input('NHap so 1 de tiep tuc')) tongtien=0

for cd in DSCD: print(cd.TenCD) print(cd.TenCaSi) print(cd.SoBaiHat) print(cd.GiaTien)

print('=============================================') tongtien+=cd.GiaTien

print("Tong tien : " + str(tongtien))

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 29

GVBS: Đà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 30

GVBS: Đà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:

 BeautifulSoup  ElementTree  Minidom

2.1.1 Khái nißm XML

Cùng giáng nh° JSON, XML là một ngôn ngữ đánh dấu XML đ°ợc viết t¿t từ tên eXtensible Markup Language, có nghĩa là ngôn ngữ đánh dấu má rộng Ngôn ngữ này đ°ợc World Wide Web Consortium (W3C) kiến nghß t¿o nên để góp ph¿n xây dựng các API Service XML có khÁ năng truyền dữ liáu và đác dßch nhiều lo¿i dữ liáu khác nhau

Trang 31

GVBS: Đà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 32

GVBS: Đà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 và file c¿n xử lý

Tuy nhiên thì ng°ßi dùng cũng c¿n biết đến các kiểu mã hóa text trong XML Nếu b¿n còn th¿c m¿c &gt là gì hay &lt là gì thì nó đ°ợc sử dụng nh° cách thay thế 2 ký tự > và <

+ KhÁ năng t°¢ng thích:

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 33

GVBS: Đà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 34

GVBS: Đà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

with open('items.xml', 'r') as f: data = f.read()

# passing data inside the beautifulsoup parser

bs_data = BeautifulSoup(data, "xml") # finding all instances of tag item bs_item = bs_data.find_all('item') print(bs_item)

# using find() to get a tag with specified attribute

bs_name = bs_data.find('item', {'name':'item1'}) print(bs_name)

Trang 35

GVBS: Đào Thị Xuân Hường Trang 28

# extracting the text stored in a tag

text = bs_name.get_text() print(text)

# extracting the data stored in a specific attribute of a tag

value = bs_name.get('price') print(value)

K¿t quÁ

[<item name="item1" price="5">book</item>, <item name="item2" price="15">chair</item>, <item name="item3" price="20">window</item>] <item name="item1" price="5">book</item> book 5

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 36

GVBS: Đà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 37

GVBS: Đà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:

print(elem.attributes['name'].value)

# one specific item's data

print('\nData of item:')

print(items[1].firstChild.data) print(items[1].childNodes[0].data)

# 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 38

GVBS: Đà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 39

GVBS: Đà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 ErrorHandler.DOM API

self.format = "" self.year = "" self.rating = "" self.stars = "" self.description = ""

# 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 40

GVBS: Đà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):

if self.CurrentData == "type": self.type = content

elif self.CurrentData == "format": self.format = content

elif self.CurrentData == "year": self.year = content

elif self.CurrentData == "rating": self.rating = content

elif self.CurrentData == "stars": self.stars = content

Ngày đăng: 02/06/2024, 11:50

Tài liệu cùng người dùng

Tài liệu liên quan