Lập Trình Theo Quá Trình
Trọng tâm của lập trình theo quá trình là hai từ "quá trình", tức là làm gì trước, làm gì sau, và làm gì cuối cùng. Cách tư duy cơ khí.
Lập trình theo quá trình không phải là một kỹ thuật, mà là một cách tư duy để giải quyết vấn đề
Ví dụ: Các bước để đặt một con voi vào tủ lạnh:
- Mở cửa tủ lạnh,
- Đặt con voi vào tủ lạnh
- Đóng cửa tủ lạnh
Ưu điểm: Giúp đơn giản hóa các vấn đề phức tạp, quy trình hóa Nhược điểm: Khả năng mở rộng kém, thay đổi một phần ảnh hưởng đến toàn bộ Ứng dụng: Ở những nơi không yêu cầu cao về khả năng mở rộng Ví dụ 2: Viết một chức năng đăng ký
Khái Niệm Lập Trình Hướng Đối Tượng
Trọng tâm của lập trình hướng đối tượng là hai từ "đối tượng"
Trong Python, mọi thứ đều là đối tượng
- Trong chương trình: Đối tượng là nơi chứa dữ liệu và chức năng
- Trong thực tế Đối tượng là sự kết hợp giữa đặc điểm và kỹ năng
Ưu điểm: Khả năng mở rộng cao Nhược điểm: Làm phức tạp hóa các vấn đề đơn giản Ứng dụng: Ở những nơi yêu cầu cao về khả năng mở rộng
Ví dụ: Hệ thống sinh viên chọn môn học
def chon_mon_hoc(thong_tin_sinh_vien, mon_hoc):
thong_tin_sinh_vien['mon_hoc_da_chon'].append(mon_hoc)
print('%s đã chọn môn %s' % (thong_tin_sinh_vien['ho_ten'], thong_tin_sinh_vien['mon_hoc_da_chon']))
sv1 = {
'ho_ten': 'Tom',
'tuoi': 19,
'gioi_tinh': 'nam',
'mon_hoc_da_chon': [],
'chon_mon_hoc': chon_mon_hoc
}
sv2 = {
'ho_ten': 'Kevin',
'tuoi': 20,
'gioi_tinh': 'nam',
'mon_hoc_da_chon': [],
'chon_mon_hoc': chon_mon_hoc
}
sv1['chon_mon_hoc'](sv1, 'Python')
sv2['chon_mon_hoc'](sv2, 'Python')
Định Nghĩa Lớp và Tạo Đối Tượng
Đối tượng: Sự kết hợp giữa đặc điểm và kỹ năng
Từ các góc độ khác nhau, việc phân loại sẽ khác nhau
Lớp: Sự kết hợp giữa các đặc điểm và kỹ năng tương đồng của một loạt đối tượng
Câu hỏi nảy sinh? Liệu có phải lớp có trước hay đối tượng có trước?
- Trong thực tế: Chắc chắn là đối tượng có trước, sau đó mới có lớp
- Trong chương trình: Phải định nghĩa lớp trước, sau đó mới gọi lớp để tạo đối tượng
Lưu ý: Tên lớp, tuân theo quy tắc đặt tên biến, tên lớp thường viết hoa chữ cái đầu
Nếu tên lớp có nhiều từ, nên sử dụng kiểu PascalCase
class SinhVien():
# Định nghĩa thuộc tính lớp
truong = 'ĐH Quốc Gia'
# Trong lớp, hàm được gọi là phương thức
def chon_mon_hoc(thong_tin_sinh_vien, mon_hoc):
thong_tin_sinh_vien['mon_hoc_da_chon'].append(mon_hoc)
print('%s đã chọn môn %s' % (thong_tin_sinh_vien['ho_ten'], thong_tin_sinh_vien['mon_hoc_da_chon']))
print(12233333)
'''
Khi định nghĩa lớp, những việc xảy ra?
1. Sau khi định nghĩa lớp, mã trong thân lớp sẽ được thực thi ngay lập tức
2. Khi thực thi mã trong thân lớp, các tên trong lớp sẽ được đưa vào không gian tên của lớp
3. Không gian tên của lớp được gán cho __dict__, tên_lớp.__dict__
'''
# Cách xem không gian tên của lớp
print(SinhVien.__dict__)
# Tạo đối tượng, gọi lớp, tên_lớp()
sv1 = SinhVien() # Gọi lớp để nhận một đối tượng rỗng
sv2 = SinhVien()
# Cách xem không gian tên của đối tượng
print(sv1.__dict__) # Từ điển rỗng
print(sv2.__dict__) # Từ điển rỗng
Tùy Ch Thuộc Tính Riêng Của Đối Tượng
class SinhVien():
# Định nghĩa thuộc tính lớp
truong = 'ĐH Quốc Gia'
# Khởi tạo, phương pháp đặc biệt
def __init__(thong_tin_sinh_vien, ho_ten, tuoi, gioi_tinh, mon_hoc_da_chon=[]):
thong_tin_sinh_vien.ho_ten = ho_ten # thong_tin_sinh_vien.__dict__['ho_ten'] = 'Tom'
thong_tin_sinh_vien.tuoi = tuoi # thong_tin_sinh_vien.__dict__['tuoi'] = 19
thong_tin_sinh_vien.gioi_tinh = gioi_tinh # thong_tin_sinh_vien.__dict__['gioi_tinh'] = 'nam'
thong_tin_sinh_vien.mon_hoc_da_chon = mon_hoc_da_chon # thong_tin_sinh_vien.__dict__['mon_hoc_da_chon'] = []
# Trong lớp, hàm được gọi là phương thức
def chon_mon_hoc(thong_tin_sinh_vien, mon_hoc):
thong_tin_sinh_vien['mon_hoc_da_chon'].append(mon_hoc)
print('%s đã chọn môn %s' % (thong_tin_sinh_vien['ho_ten'], thong_tin_sinh_vien['mon_hoc_da_chon']))
# SinhVien()
# sv = SinhVien(sv, 'Tom', 19, 'nam')
sv = SinhVien('Tom', 19, 'nam') # Khi gọi lớp, phương thức __init__ sẽ được tự động kích hoạt, và đối tượng chính sẽ được truyền làm tham số đầu tiên cho hàm
sv1 = SinhVien('Kevin', 19, 'nam') # Khi gọi lớp, phương thức __init__ sẽ được tự động kích hoạt, và đối tượng chính sẽ được truyền làm tham số đầu tiên cho hàm
# print(sv.__dict__)
# print(sv1.__dict__)
'''
Quá trình gọi lớp còn được gọi là quá trình thực thể hóa, đối tượng nhận được được gọi là một thực thể
'''
Thứ Tự Tìm Kiếm Thuộc Tính
print(sv1.__dict__)
# 1. Thuộc tính lớp
# Đọc
# print(SinhVien.__dict__['truong'])
# print(SinhVien.truong)
#
# # Sửa
# SinhVien.truong = 'xxx'
#
#
# del SinhVien.truong
# # Xóa
#
# # Thêm
# SinhVien.aaa = 'xxx'
# print(SinhVien.__dict__)
# 2. Thêm, sửa, xóa thuộc tính của đối tượng
# print(sv.ho_ten)
# print(sv.tuoi)
# print(sv.gioi_tinh)
# print(sv1.ho_ten)
# print(sv1.tuoi)
# print(sv1.gioi_tinh)
# Thứ tự tìm kiếm thuộc tính của đối tượng: Tìm trong không gian tên của chính đối tượng trước, nếu không tìm thấy, hãy tìm trong lớp tạo ra đối tượng
print(sv.truong)
# print(sv.__dict__['truong'])
# Thêm
sv.x = 'aaa'
print(sv.__dict__)
# Sửa
sv.x = 'bbb'
# Xóa
del sv.x