Professional Documents
Culture Documents
1
Lập trình hướng đối tượng
với Python
Nội dung
ØLập trình hướng đối tượng (OOP)
ØĐối tượng (object)
ØLớp (class)
ØPhương thức (method)
ØKế thừa
ØĐa hình
ØĐóng gói
ØTrừu tượng
ØBài tập
3
Giới thiệu lập trình hướng đối tượng
TT Lập trình hướng đối tượng Lập trình hướng cấu trúc/chức năng
1 Lập trình hướng đối tượng là cách tiếp Lập trình thủ tục sử dụng một danh sách
cận giải quyết vấn đề và được sử các hướng dẫn để thực hiện tính toán từng
dụng trong đó tính toán được thực bước.
hiện bằng cách sử dụng các đối
tượng.
2 Giúp phát triển và bảo trì dễ dàng Trong lập trình thủ tục, khó để bảo trì khi
hơn. dự án mở rộng.
3 Trong lập trình thủ tục, không dễ để Nó không mô phỏng thế giới thực. Nó hoạt
duy trì các mã khi dự án trở nên dài. động theo từng bước hướng dẫn được chia
thành các phần nhỏ gọi là hàm.
4 Nó cung cấp dữ liệu ẩn. Vì vậy, nó an Ngôn ngữ thủ tục không cung cấp bất kỳ
toàn hơn các ngôn ngữ thủ tục. Bạn cách thích hợp nào để liên kết dữ liệu, vì
không thể truy cập dữ liệu riêng tư từ vậy nó kém an toàn hơn.
bất cứ đâu.
5 Ví dụ về các ngôn ngữ lập trình hướng Ví dụ về các ngôn ngữ thủ tục là: C,
đối tượng là C++, Java, .Net, Python, Fortran, Pascal, VB, v.v.
C #, v.v.
Lập trình OOP với Python
Tham số
'self' là gì?
2. Hàm tạo của một lớp
v Cách viết hàm tạo:
class <Tên lớp>:
[Khối lệnh]
def __init__(self):
Student.count = Student.count + 1
s1 = Student()
s2 = Student()
s3 = Student()
print("Số lượng sinh viên là:", Student.count)
Hàm tạo không tham số
v Ví dụ 7:
class Student:
def __init__(self):
print("Đây là constructor không tham số")
student = Student()
student.show("Thanh Thảo.")
Hàm tạo không tham số
v Ví dụ 7:
Hàm tạo có tham số
v Ví dụ 8:
class Student:
# Constructor tham số
def __init__(self, name):
print("Đây là constructor tham số.")
self.name = name
def show(self):
print("Xin chào!", self.name)
print("Porsche là {}.".format(porsche.loaixe))
print("Toyota là {}.".format(toyota.loaixe))
print("Lamborghini cũng là {}.".format(lamborghini.loaixe))
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))
3. Thay đổi giá trị của các thuộc tính
v Các giá trị của thuộc tính của một đối tượng có thể
thay đổi trong khi thực hiện chương trình
v Ví dụ 10:
class Nguoi:
def __init__(self, ten, tuoi):
self.ten = ten
self.tuoi = tuoi
def infor(self):
print("Ten:", self.ten)
print("Tuoi:", self.tuoi)
Hàm Mô tả
getattr(obj, name, default) Sử dụng để truy cập thuộc tính của đối
tượng.
setattr(obj, name, value) Sử dụng để đặt một giá trị cụ thể cho
thuộc tính cụ thể của một đối tượng.
v Ví dụ 11:
Các thuộc tính lớp tích hợp
Hàm Mô tả
__bases__ Chứa một tuple bao gồm tất cả các lớp cơ sở.
Ví dụ 12
class Student:
def __init__(self, name, id, age):
self.name = name;
self.id = id;
self.age = age
def display_details(self):
print("Name: %s, ID: %d, age: %d" %(self.name, self.id, self.age))
Kế thừa
Inheritance
Đóng gói
Abstraction
Đóng gói và Đa hình
v Đó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, 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 “__”.
v Đa hình (Polymorphism)
Ø Tính đa hình là khái niệm mà hai hoặc nhiều lớp có những
phương thức giống nhau nhưng có thể thực thi theo những
cách thức khác nhau.
Ví dụ minh họa
Python đã
coi __maxprice
là thuộc tính
private. Vậy
nên để thay đổi
giá trị, ta sử
dụng hàm
setMaxPrice().
Ví dụ minh họa
- Hai lớp Toyota và Porsche đều
có phương thức dungxe(). Tuy
nhiên hàm của chúng khác
nhau.
- Sử dụng tính đa hình để tạo
hàm chung cho hai lớp, đó
là kiemtra_dungxe().
Trừu tượng dữ liệu trong Python
v Trừu tượng là một khía cạnh quan trọng của lập trình hướng
đối tượng.
v Trong Python, có thể thực hiện ẩn dữ liệu bằng cách thêm
dấu gạch dưới kép (__) làm tiền tố cho thuộc tính cần ẩn.
v Khi đó, thuộc tính sẽ không hiển thị bên ngoài lớp thông qua
đối tượng.
v Ví dụ:
class Employee:
__count = 0;
def __init__(self):
Employee.__count = Employee.__count + 1
def display(self):
print("Số lượng nhân viên:", Employee.__count)
Trừu tượng dữ liệu trong Python
v Ví dụ:
5. OOP với Python
Kế thừa
Inheritance
Đóng gói
Abstraction
Sự kế thừa trong Python
Sự kế thừa trong Python
v Kế thừa là một tính chất quan trọng của lập trình hướng đối
tượng.
v Kế thừa cung cấp khả năng sử dụng lại mã cho chương trình
vì có thể sử dụng một lớp hiện có để tạo một lớp mới thay vì
tạo nó từ đầu.
v Trong kế thừa, lớp con có được các thuộc tính và có thể truy
cập tất cả các thành phần được định nghĩa trong lớp cha.
vTrong Python, một lớp dẫn xuất (hay còn gọi là lớp con -
subclass) có thể kế thừa lớp cơ sở (lớp cha - superclass) bằng
cách đề cập đến lớp cơ sở trong ngoặc sau tên lớp dẫn xuất.
Ø Đơn kế thừa
Ø Kế thừa đa cấp
Ø Đa kế thừa
Đơn kế thừa trong Python
v Cú pháp:
class <Lớp con>(<Lớp cha>):
<Thân lớp> Lớp cha
v Ví dụ 14
class Nguoi:
…
class SinhVien(Nguoi): Lớp con
def __init__(self, ten, tuoi, nam):
Nguoi.__init__(self, ten, tuoi)
self.totnghiep = nam
def infor(self):
Nguoi.infor(self)
print("Nam tot nghiep:", self.totnghiep)
Đơn kế thừa trong Python
v Ví dụ 14:
Đơn kế thừa trong Python
v Ví dụ 15: Cập nhật thông tin các thuộc tính của đối tượng
Ví dụ 16: vận dụng
v Giả sử cho lớp DaGiac được tạo như sau:
v Ví dụ 17:
Đa kế thừa trong Python
v Ví dụ 18:
Kế thừa trong Python
v Phương thức issubclass (sub, sup)
Ø Được sử dụng để kiểm tra mối quan hệ giữa
các lớp được chỉ định.
Ø Trả về True nếu lớp sub là lớp con của lớp sup
và ngược lại là False.
v Phương thức isinstance (obj, class)
Ø Được sử dụng để kiểm tra mối quan hệ giữa
các đối tượng và các lớp.
Ø Trả về True nếu tham số obj là thể hiện của
tham số lớp class.
Ví dụ 19
Hàm super()
Dùng
hàm
super()
Hàm super()
v Ví dụ 20: Lớp SinhVien kế thừa từ lớp Nguoi:
6. Nạp chồng toán tử
6. Nạp chồng toán tử
v Một toán tử có thể được sử dụng để thực hiện
nhiều hoạt động khác nhau.
ØVí dụ với toán tử ' + ', có thể cộng số học hai số với
nhau, có thể kết hợp hai danh sách, hoặc nối hai
chuỗi khác nhau lại…
v Nạp chồng toán tử, cho phép cùng một toán tử
được sử dụng khác nhau tùy từng ngữ cảnh.
Ví dụ 21
class Point:
def __init__(self, x = 0, y = 0):
self.x = x
self.y = y
def __str__(self):
return "({0},{1})".format(self.x, self.y)
p1 = Point(2,3)
print(p1)
6. Nạp chồng toán tử
v Một số hàm đặc biệt dùng cho nạp chồng toán tử
Ký hiệu phép toán Phương thức thực hiện
+ __add__(self, other)
- __sub__(self, other)
* __mul__(self, other)
** __pow__(self, other)
/ __truediv__(self, other)
// __floordiv__(self, other)
% __mod__(self, other)
Ví dụ 22
v Nạp chồng toán tử ‘+’, sử dụng hàm __add__()
trong class.
v Ví dụ cộng hai điểm tọa độ
Ví dụ 22