Thứ Bảy, 1 tháng 6, 2024

59. Constructor,xử lý ngoại lệ trong Python

Các hàm khởi tạo (Constructor) thường được sử dụng để khởi tạo một đối tượng (Object). Nhiệm vụ là khởi tạo (gán giá trị) cho các thành phần dữ liệu của lớp khi một đối tượng của lớp được tạo. Trong Python, phương thức __init__() được gọi là hàm khởi tạo và luôn được gọi khi một đối tượng được tạo.


Cú pháp khai báo hàm khởi tạo:

def __init__(self):
# phần thân của hàm khởi tạo


Các loại hàm khởi tạo:

  • Hàm khởi tạo mặc định (default constructor): Hàm khởi tạo mặc định là một hàm đơn giản không chấp nhận bất kỳ đối số nào. Định nghĩa của nó chỉ có một đối số là tham chiếu đến thể hiện đang được xây dựng.
  • Hàm khởi tạo có tham số (parameterized constructor): hàm khởi tạo có tham số được gọi là parameterized constructor. Hàm khởi tạo có tham số lấy đối số đầu tiên của nó làm tham chiếu đến thể hiện đang được xây dựng được gọi là self (Hay bất kỳ cái gì bạn muốn) và các đối số còn lại do lập trình viên cung cấp.


Ví dụ về hàm khởi tạo mặc định:

class SinhVien:
 
    def __init__(self, name, id):
        self.id = id;
        self.name = name;
 
    def display (self):
        print("ID: %d \nName: %s" % (self.id, self.name))
 
sv1 = SinhVien("Nguyen Van A", 101)
sv2 = SinhVien("Tran Van B", 102)
 
# gọi phương thức display() để hiển thị thông tin sinh vien 1
sv1.display();
   
# gọi phương thức display() để hiển thị thông tin sinh vien 2
sv2.display();



Sử dụng IDE Online để chạy Code

 


 

Nói chung, cứ hiểu hàm khởi tạo chủ yếu được sử dụng để khởi tạo các thuộc tính của đối tượng. Mỗi lớp phải có một constructor, khi đối tượng được tạo ra thì đã "có sẵn vốn" là một constructor. Kiểu như đám cưới xong có vốn là mấy "lượng" vàng, để nguyên vậy hay muốn làm dây chuyền, nhẫn...thì tùy ý.

Class ==> Objects ==> Constructor

 

Python có nhiều hàm dựng sẵn (built-in functions)  đây là vài hàm trong số đó.



Hàm

Mô tả

1

getattr(obj,name,default)

Được sử dụng để truy cập thuộc tính của đối tượng.

2

setattr(obj, name,value)

Được sử dụng để đặt một giá trị cụ thể cho thuộc tính cụ thể của một đối tượng.

3

delattr(obj, name)

Được sử dụng để xóa một thuộc tính cụ thể.

4

hasattr(obj, name)

Trả về true nếu đối tượng chứa một số thuộc tính cụ thể.

 

Chúng ta thử chạy code sau để hình dung chức năng của mấy hàm duwnhj sẵn trên

 

class SinhVien:
 
    def __init__(self, name, id, age):
        self.name = name;
        self.id = id;
        self.age = age
 
   
# tạo đối tượng của lớp SinhVien
s = SinhVien("Tran Van A", 101, 22)
 
# in thuộc tính name của đối tượng s
print(getattr(s, 'name'))
   
# gán giá trị của age la 24
setattr(s, "age", 24)
 
# in giá trị của age ra man hinh
print(getattr(s, 'age'))
 
# true nếu student chứa thuộc tính id
print(hasattr(s, 'id'))
 
# xóa thuộc tính age
delattr(s, 'age')
 
# phat sinh lỗi nếu age đã bị xóa
print(s.age)

 

Sử dụng IDE Online để chạy chương trình

 


Xử lý ngoại lệ (Exception) trong Python

Ngoại lệ (Exception) có thể là bất kỳ điều kiện bất thường nào trong chương trình mà phá vỡ luồng thực thi chương trình đó. Bất cứ khi nào một ngoại lệ xuất hiện, mà không được xử lý, thì chương trình ngừng thực thi và vì thế code không được thực thi. Hiểu hơi "đơn giản hóa" một chút thì ngoại lệ là những lỗi xảy ra khi thực thi chương trình. Mỗi khi thử chạy code mà xuất hiện những dòng chữ màu đỏ thì chắc chắn đã có lỗi gì đó, nói cách khác đã có một Exception xuất hiện.

Python đã định nghĩa sẵn rất nhiều ngoại lệ, được trình bày trong Standard Exception.

Trong quá trình thảo luận những chương trình...tào lao của chúng ta, chúng ta đã thấy những dòng chữ đỏ báo hiệu những điều...không lấy gì tốt đẹp nhiều lần, và đó là những lỗi của code hay những Exception đã xuất hiện.

Nếu bạn thấy bất cứ code nào là khả nghi (có thể gây ra ngoại lệ) thì bạn có thể phòng thủ chương trình của mình bằng cách đặt các khối code khả nghi này trong một khối try. Khối try này được theo sau bởi lệnh except. Sau đó, nó được theo sau bởi các lệnh mà xử lý vấn đề đó. Nếu chúng ta phòng thủ bằng cách đặt code khả nghi trong khối try thì chương trình của chúng ta sẽ không dừng lại mà vẫn thực thi, và cho chúng ta biết chuyện gì đã xảy ra hoặc thực thi những gì chúng ta muốn.

Cú pháp:


Cú pháp của khối try....except...else trong Python:


try:
  
   Day la phan code co the tao exception;
   ......................
except ExceptionI:
   Neu co ExceptionI, thi thuc thi khoi code nay
except ExceptionII:
   Neu co ExceptionII, thi thuc thi khoi code nay
   ......................
else:
   Neu khong co exception nao thi thuc thi khoi code nay

Lưu ý:

  • Phần code khả nghi mà có khả năng tạo exception cần được bao quanh trong khối try.
  • Khối try được theo sau bởi lệnh except. Có thể có một hoặc nhiều lệnh except với một khối try đơn.
  • Lệnh except xác định exception mà xảy ra. Trong trường hợp mà exception đó xảy ra, thì lệnh tương ứng được thực thi.
  • Ở cuối khối try catch, bạn có thể cung cấp lệnh else. Nó được thực thi khi không có exception nào xảy ra. Khối else là địa điểm tốt cho code mà không cần sự bảo vệ của khối try.

Đây là một đoạn code đơn giản, chúng ta chạy thử trên IDE Online.

tongSo = 10000
if(tongSo > 2999)
print("Ban co the vao sieu thi mua hang")

Kết quả


 

Đã có lỗi xảy ra, hay đã có một  Exception xuất hiện vì thiếu dấu hai chấm :. Lỗi có thể xảy ra bất cứ lúc nào, chúng ta thêm một ví dụ, chúng ta cộng một chuỗi với một số:

x = 5
y = "hello"
z = x + y


Chạy thử chương trình


 

Đã có một Exception xuất hiện vì ta đã "cố" ghép sơn tinh với thủy tinh. Code của chúng ta cố gắng cộng một số nguyên x và một chuỗi y với nhau, code này không hợp lệ và sẽ gây ra 'TypeError'. Chúng ta sẽ sử dụng khối 'try' và 'except' để bắt ngoại lệ này và in ra thông báo lỗi.


x = 5
y = "hello"
try:
    z = x + y
except TypeError:
    print("Co loi: ban khong the cong mot int voi mot str")


Chạy chương trình

 



 

Bạn có để ý thấy rằng giờ đây chương trình đã chạy hoàn tất, với exit code 0. Lỗi vẫn xảy ra, nhưng chương trình không dừng "bất tử" giữa chừng mà hoàn toàn có thể tiếp tục với những dòng code tiếp theo.
 

Phần tiếp theo


Phần trước




Không có nhận xét nào:

Đăng nhận xét