Toidicode.com

Toidicode.com

BASIC TO ADVANCE

Bài 2: Constructor và destructor trong Python

Phần trước chúng ta đã được tìm hiểu qua về class và các thành phần trong Class rồi, bài này chúng ta sẽ tiếp tục tìm hiểu về 2 phương thức đặc biệt trong một class, đó là phương thức khởi tạo và phương thức hủy trong class.

1, Phương thức khởi tạo - constructor.

Phương thức khởi tạo là một phương thức đặc biệt ở trong class, phương thức này mặc định sẽ được gọi khi chúng ta khởi tạo class đó. Nó thường được dùng để khởi tạo các thuộc, xử lý phương thức hoặc là dùng để nhận các tham số truyền vào class khi khởi tạo.

Để khai báo một phương thức khởi tạo trong class thì mọi người chỉ cần viết một hàm có tên là __init__ với cú pháp như sau:

Cú pháp:

class className:
    def __init__(self, param1, param2,...):
        #

Trong đó:

  • className là tên của class.
  • param1, param2,... là các tham số chúng ta muốn nhận khi kèm khi khởi tạo class.

VD:

class Person:
    def __init__(self):
        print("Class person được khởi tạo!")
        
person = Person()
# kết quả: Class person được khởi tạo!

Như các bạn đã thấy thì ở ví dụ trên mình mới chỉ khởi tạo class là nó đã thực thi phương thức __init__.

VD: Khai báo các tham số truyền vào cho phương thức khởi tạo.

class Person:
    def __init__(self, name, age, male):
        print("Class person được khởi tạo!")
        print("Name: %s - Age: %d - Male: %d" %(name, age, male))

person = Person('Vu Thanh Tai', 22, True)
# kết quả: 
# Class person được khởi tạo!
# Name: Vu Thanh Tai - Age: 22 - Male: 1

2, Phương thức hủy - deconstructor.

Trái ngược với phương thức khởi tạo, thì phương thức hủy sẽ được gọi khi chúng ta hủy một class, hay nó cách khác nó luôn được thực thi cuối cùng khi chúng ta khởi tạo một class. Nó thường được dùng để giải phóng tài nguyên của class.

Để khai báo một phương thức hủy trong class thì mọi người chỉ việc khai báo một phương thức có tên là __del__ với cú pháp sau:

Cú pháp:

def __del__(self):
    # code

VD: Mình sẽ khai báo một phương thức hủy cho class Person ở trên.

class Person:
    def __init__(self, name, age, male):
        print("Class person được khởi tạo!")
        print("Name: %s - Age: %d - Male: %d" %(name, age, male))
    def __del__(self):
        print('Class Person được hủy')
person = Person('Vu Thanh Tai', 22, True)
# kết quả: 
# Class person được khởi tạo!
# Name: Vu Thanh Tai - Age: 22 - Male: 1
# Class Person được hủy

VD: Mình sẽ thêm một vài phương thức nữa cho mọi người dễ hiểu.

class Person:
    def __init__(self, name, age, male):
        print("Class person được khởi tạo!")
        self.name, self.age, self.male = name, age, male
    
    def getName(self):
        print("Name: %s" %(self.name))
    
    def getAge(self):
        print("Age: %d" %(self.age))
    
    def getMale(self):
        print("Male: %d" %(self.male))
    
    def __del__(self):
        print('Class Person được hủy')
        del self.name,self.age,self.male

person = Person('Vu Thanh Tai', 22, True)
person.getName()
person.getAge()
person.getMale()
# kết quả: 
# Class person được khởi tạo!
# Name: Vu Thanh Tai
# Age: 22
# Male: 1
# Class Person được hủy

Như các bạn đã thấy thì sau khi thực truy xuất các phương thức trong class xong thì hàm hủy tự động được gọi, và trong hàm hủy mình đã sử dụng để giải phóng các thuộc tính trong class Person.

3, Lời kết.

Hai hàm này có thuật ngữ là magic method - các phương thức ma thuật :), và trong class thì có rất nhiều các magic methods khác nữa mình sẽ trình bày với mọi người ở phần sau nhé!

Đăng ký nhận tin.

Chúng tôi chỉ gửi tối đa 2 lần trên 1 tháng. Tuyên bố không spam mail!

Vũ Thanh Tài

About author
The best way to learn is to share
Xem tất cả bài đăng

13 Comments

Cho em hỏi nếu mình không định nghĩa deconstructor thì đối tượng có tự hủy không ạ?

Quang

7 năm trước

Không nhé bạn!

Vũ Thanh Tài

7 năm trước

public int Index;
public Int16 ClusterIndex { get; set; }
 public Int32 ClusterCount { get; set; }
public int X { get; set; }
public int Y { get; set; }

public List<double> Data;

public CDataPoint(double[] data, int x=0, int y=0)
        {
            this.Data = new List<double>();
            for (int i = 0; i < data.Length; i++) this.Data.Add(Convert.ToDouble(data[i]));
            this.ClusterIndex = 0;
            this.ClusterCount = 0;
            this.X = x; this.Y = y;
        }

Phạm Văn Vũ

6 năm trước

Các bác giúp em ơi! Chuyển giúp em đoạn mã trên sang python được ko ạ! em cảm ơn! Híc!

Phạm Văn Vũ

6 năm trước

Theo mình hiểu, bản chất constructor và deconstructor là 2 hàm tự động gọi khi bắt đầu và kết thúc class. Deconstructor thường được dùng để xóa biến, giảm tài nguyên. Vậy biến ở đây nghĩa là các biến trung gian trong quá trình tính toán để đưa ra kết quả, không cần giữ lại. Hay biến ở đây là tất cả các biến? Mình ko hiểu chỗ này, mong ad giải thích. Thanks.

Văn Phan

6 năm trước

cái %s, %d ở trên là sao z ạ

lmq

6 năm trước

%s đại diện cho chuỗi ( tên )

phúc phúc

8 tháng trước

Mình nghĩ là biến trung gian  trong quá trình thôi . Vì khi ta khai báo lại instance thì vẫn có dữ liệu ( atttribute, method ) đi cùng với nó . Và khi ta khai instance mới thì lại được ghi là Class đã được khởi tạo , nghĩa là nó vẫn dữ chứ ko xóa hoàn toàn.

Đấy là theo mình . Mong anh Tài giả đáp

Nguyên Xuân Lộc

5 năm trước

Bài viết khá là chi tiết, cám ơn tác giả! 

Tu Nguyen

5 năm trước

Cho mình hỏi nếu như hàm decontructor dc gọi tự động và chúng ta thực thi việc xóa tất cả các prop của instance , vậy khi mình gọi lại prop nào đó thì nó có lấy lại giá trị cũ hay ko,

- nếu có thì hàm này đâu có ỹ nghĩa 

- nếu không thì mình muốn sủ dụng lại cái instance đó thì new lại hay sao => quá bất tiện

Điền Trần

5 năm trước

Hi

Bui the Bao

4 năm trước

vd 1 của

Minh

4 năm trước

Mình chạy code không thấy tự hủy!

danpc

4 giờ trước

Bình luận

Captcha