Select Page

Vật thể Python: Tạo lớp & Đối tượng

Bài viết này sẽ hướng dẫn bạn cách tạo lớp và đối tượng trong Python, một khái niệm quan trọng trong lập trình hướng đối tượng. Bạn sẽ học cách định nghĩa lớp, khởi tạo đối tượng và sử dụng các phương thức trong lớp. Khám phá ngay cách tạo các ứng dụng Python mạnh mẽ và linh hoạt!

Giới thiệu về Lớp và Đối tượng

Trong thế giới lập trình hướng đối tượng (OOP), hai khái niệm nền tảng mà bạn sẽ thường xuyên gặp phải là lớpđối tượng. Chúng là những viên gạch xây dựng nên các ứng dụng phức tạp và mạnh mẽ. Để hiểu rõ hơn về cách chúng hoạt động trong Python, chúng ta hãy cùng nhau khám phá chi tiết.

Object trong lập trình Python, hay còn gọi là đối tượng, là một thực thể cụ thể, một bản sao của một lớp. Hãy tưởng tượng một lớp như một bản thiết kế, và đối tượng như một ngôi nhà được xây dựng dựa trên bản thiết kế đó. Mỗi đối tượng có các thuộc tính (dữ liệu) và phương thức (hành động) riêng biệt, cho phép chúng tương tác với nhau và thực hiện các nhiệm vụ khác nhau. Ví dụ, nếu bạn có một lớp “Xe hơi”, thì một đối tượng cụ thể có thể là chiếc xe màu đỏ của bạn với số VIN cụ thể và tốc độ hiện tại.

Lớp, mặt khác, là một bản thiết kế hoặc khuôn mẫu để tạo ra các đối tượng. Nó định nghĩa các thuộc tính và phương thức mà các đối tượng thuộc lớp đó sẽ có. Lớp không phải là một thực thể cụ thể; nó chỉ là một định nghĩa. Chúng ta không thể tương tác trực tiếp với lớp, mà phải thông qua các đối tượng được tạo ra từ nó. Quay lại ví dụ về “Xe hơi”, lớp sẽ định nghĩa các thuộc tính như màu sắc, số bánh, và các phương thức như “tăng tốc”, “phanh”, nhưng nó không phải là một chiếc xe cụ thể nào cả.

Sự khác biệt chính giữa lớp và đối tượng nằm ở tính trừu tượng và tính cụ thể. Lớp là trừu tượng, là một khái niệm, trong khi đối tượng là cụ thể, là một thực thể tồn tại trong bộ nhớ. Một lớp có thể được sử dụng để tạo ra nhiều đối tượng khác nhau, mỗi đối tượng có trạng thái riêng biệt. Ví dụ, bạn có thể có nhiều đối tượng “Xe hơi” khác nhau, mỗi chiếc có màu sắc, số VIN và tốc độ khác nhau, nhưng tất cả đều được tạo ra từ cùng một lớp “Xe hơi”.

Để minh họa rõ hơn, chúng ta hãy xem xét một ví dụ đơn giản về việc tạo lớp trong Python. Giả sử chúng ta muốn tạo một lớp đại diện cho một “Con chó”. Lớp này sẽ có các thuộc tính như tên, giống, và tuổi, và các phương thức như “sủa” và “ăn”.

Dưới đây là một ví dụ đơn giản về mã Python:


class ConCho:
    def __init__(self, ten, giong, tuoi):
        self.ten = ten
        self.giong = giong
        self.tuoi = tuoi

    def sua(self):
        print("Gau gau!")

    def an(self):
        print("Ăn ngon quá!")

Trong đoạn mã trên, chúng ta đã định nghĩa một lớp có tên “ConCho”. Hàm __init__ là một phương thức đặc biệt được gọi là phương thức khởi tạo. Nó được sử dụng để khởi tạo các thuộc tính của đối tượng khi nó được tạo ra. Các phương thức suaan định nghĩa các hành động mà đối tượng “Con chó” có thể thực hiện.

Bây giờ, chúng ta hãy xem cách tạo đối tượng từ lớp “ConCho”:


my_dog = ConCho("Buddy", "Golden Retriever", 3)

Ở đây, chúng ta đã tạo một đối tượng có tên my_dog từ lớp ConCho. Chúng ta đã truyền các giá trị “Buddy”, “Golden Retriever”, và 3 cho các thuộc tính tên, giống, và tuổi tương ứng. Bây giờ, my_dog là một đối tượng cụ thể, có các thuộc tính và phương thức riêng biệt.

Chúng ta có thể truy cập các thuộc tính của đối tượng và gọi các phương thức của nó như sau:


print(my_dog.ten) # In ra: Buddy
my_dog.sua() # In ra: Gau gau!

Như bạn thấy, đối tượng my_dog có thể truy cập vào các thuộc tính và phương thức được định nghĩa trong lớp ConCho. Điều này cho phép chúng ta tạo ra các đối tượng có cấu trúc và hành vi cụ thể, đồng thời tận dụng lại mã một cách hiệu quả. Việc sử dụng lớp và đối tượng giúp chúng ta tổ chức mã một cách rõ ràng và dễ quản lý hơn, đặc biệt là trong các dự án lớn và phức tạp. Đây là một trong những lợi ích cốt lõi của lập trình hướng đối tượng.

Việc hiểu rõ sự khác biệt giữa lớp và đối tượng là rất quan trọng để nắm vững các khái niệm cơ bản của lập trình hướng đối tượng. Trong chương tiếp theo, chúng ta sẽ đi sâu hơn vào việc Tạo Lớp trong Python, khám phá cách định nghĩa lớp chi tiết hơn, bao gồm việc sử dụng các thuộc tính, phương thức, và phương thức khởi tạo (__init__). Chúng ta cũng sẽ cung cấp các ví dụ cụ thể về việc tạo lớp đại diện cho một sản phẩm, một người dùng, hay một hình học, giúp bạn hiểu rõ hơn về cách ứng dụng các khái niệm này vào thực tế.

Tạo Lớp trong Python

Sau khi đã làm quen với khái niệm về Object trong lập trình Python và sự khác biệt giữa lớp và đối tượng trong chương trước, chúng ta sẽ đi sâu vào cách tạo lớp trong Python. Lớp là bản thiết kế cho các đối tượng, nó định nghĩa các thuộc tính (dữ liệu) và phương thức (hành vi) mà các đối tượng thuộc lớp đó sẽ có. Việc tạo lớp là bước quan trọng để xây dựng các ứng dụng hướng đối tượng.

Định nghĩa một lớp trong Python

Để định nghĩa một lớp, chúng ta sử dụng từ khóa class, theo sau là tên lớp. Tên lớp thường được đặt theo quy tắc CamelCase (ví dụ: SanPham, NguoiDung). Dưới đây là cú pháp cơ bản:

class TenLop:
    # Các thuộc tính và phương thức của lớp
    pass

Trong ví dụ trên, pass là một câu lệnh không làm gì cả, nó được sử dụng để tạo một lớp rỗng. Thông thường, chúng ta sẽ định nghĩa các thuộc tính và phương thức bên trong lớp.

Thuộc tính của lớp

Thuộc tính (attributes) là các biến được liên kết với lớp và các đối tượng của lớp. Chúng đại diện cho dữ liệu của đối tượng. Chúng ta thường sử dụng phương thức khởi tạo __init__ để thiết lập các thuộc tính khi một đối tượng được tạo. Phương thức __init__ là một phương thức đặc biệt, nó được gọi tự động khi bạn tạo một đối tượng mới từ lớp.

class SanPham:
    def __init__(self, ten, gia, mo_ta):
        self.ten = ten
        self.gia = gia
        self.mo_ta = mo_ta

Trong ví dụ trên, SanPham là một lớp đại diện cho một sản phẩm. Phương thức __init__ nhận ba tham số: ten, gia, và mo_ta. Các tham số này được gán cho các thuộc tính của đối tượng: self.ten, self.gia, và self.mo_ta. Từ khóa self là một tham chiếu đến đối tượng hiện tại.

Phương thức của lớp

Phương thức (methods) là các hàm được định nghĩa bên trong lớp. Chúng đại diện cho hành vi của đối tượng. Phương thức luôn có tham số đầu tiên là self, nó là tham chiếu đến đối tượng gọi phương thức đó.

class SanPham:
    def __init__(self, ten, gia, mo_ta):
        self.ten = ten
        self.gia = gia
        self.mo_ta = mo_ta

    def hien_thi_thong_tin(self):
        print(f"Tên: {self.ten}, Giá: {self.gia}, Mô tả: {self.mo_ta}")

Trong ví dụ trên, hien_thi_thong_tin là một phương thức của lớp SanPham. Phương thức này in ra thông tin của sản phẩm.

Ví dụ cụ thể về việc tạo lớp

Chúng ta hãy xem xét một số ví dụ cụ thể về việc tạo lớp:

  • Lớp đại diện cho một sản phẩm:
    class SanPham:
                def __init__(self, ten, gia, mo_ta, so_luong):
                    self.ten = ten
                    self.gia = gia
                    self.mo_ta = mo_ta
                    self.so_luong = so_luong
    
                def hien_thi_thong_tin(self):
                    print(f"Tên: {self.ten}, Giá: {self.gia}, Mô tả: {self.mo_ta}, Số lượng: {self.so_luong}")
    
                def cap_nhat_so_luong(self, so_luong_moi):
                    self.so_luong = so_luong_moi
                    print(f"Số lượng sản phẩm {self.ten} đã được cập nhật thành: {self.so_luong}")
            
  • Lớp đại diện cho một người dùng:
    class NguoiDung:
                def __init__(self, ten_dang_nhap, email, mat_khau):
                    self.ten_dang_nhap = ten_dang_nhap
                    self.email = email
                    self.mat_khau = mat_khau
    
                def hien_thi_thong_tin(self):
                    print(f"Tên đăng nhập: {self.ten_dang_nhap}, Email: {self.email}")
            
  • Lớp đại diện cho một hình chữ nhật:
    class HinhChuNhat:
                def __init__(self, chieu_dai, chieu_rong):
                    self.chieu_dai = chieu_dai
                    self.chieu_rong = chieu_rong
    
                def tinh_dien_tich(self):
                    return self.chieu_dai * self.chieu_rong
    
                def tinh_chu_vi(self):
                    return 2 * (self.chieu_dai + self.chieu_rong)
            

Các ví dụ trên minh họa cách chúng ta có thể tạo các lớp khác nhau, mỗi lớp đại diện cho một loại đối tượng khác nhau. Chúng ta sử dụng phương thức __init__ để khởi tạo các thuộc tính của đối tượng và định nghĩa các phương thức để thực hiện các hành vi của đối tượng.

Việc nắm vững cách Tạo lớp là nền tảng quan trọng để hiểu sâu hơn về lập trình hướng đối tượng trong Python. Tiếp theo, chúng ta sẽ tìm hiểu cách tạo và sử dụng các đối tượng từ các lớp đã định nghĩa.

Tạo và Sử dụng Đối tượng

Sau khi đã tìm hiểu về cách Tạo lớp trong Python ở chương trước, chúng ta sẽ tiếp tục khám phá cách tạo và sử dụng các đối tượng từ lớp đã định nghĩa. Việc tạo đối tượng là bước quan trọng để tận dụng sức mạnh của lập trình hướng đối tượng, cho phép chúng ta làm việc với các thực thể cụ thể dựa trên bản thiết kế của lớp.

Một đối tượng, trong ngữ cảnh của lập trình hướng đối tượng, là một thể hiện cụ thể của một lớp. Nó có các thuộc tính và phương thức được định nghĩa trong lớp, nhưng với các giá trị cụ thể. Ví dụ, nếu chúng ta có một lớp SanPham (Sản phẩm), mỗi sản phẩm cụ thể như “Điện thoại iPhone 15” hay “Laptop Dell XPS 13” sẽ là một đối tượng của lớp đó. Để tạo một đối tượng, chúng ta gọi lớp như một hàm, và Python sẽ tạo ra một thể hiện mới của lớp đó.

Để minh họa rõ hơn, hãy xem xét lại lớp SanPham mà chúng ta đã định nghĩa trong chương trước:


class SanPham:
    def __init__(self, ten, gia, mo_ta):
        self.ten = ten
        self.gia = gia
        self.mo_ta = mo_ta

    def hien_thi_thong_tin(self):
        print(f"Tên sản phẩm: {self.ten}")
        print(f"Giá: {self.gia}")
        print(f"Mô tả: {self.mo_ta}")

Trong lớp này, phương thức __init__ là phương thức khởi tạo, được gọi tự động khi một đối tượng được tạo. Nó nhận các tham số ten, gia, và mo_ta, và gán chúng vào các thuộc tính tương ứng của đối tượng (self.ten, self.gia, self.mo_ta). Các thuộc tính này là các biến lưu trữ thông tin riêng của từng đối tượng. Phương thức hien_thi_thong_tin cho phép chúng ta in ra thông tin của đối tượng.

Bây giờ, hãy xem cách chúng ta tạo và sử dụng các đối tượng từ lớp SanPham:


# Tạo đối tượng san_pham1
san_pham1 = SanPham("Điện thoại iPhone 15", 25000000, "Điện thoại thông minh cao cấp của Apple")

# Tạo đối tượng san_pham2
san_pham2 = SanPham("Laptop Dell XPS 13", 35000000, "Laptop siêu mỏng, hiệu năng cao")

# Gọi phương thức hien_thi_thong_tin của san_pham1
san_pham1.hien_thi_thong_tin()

# Gọi phương thức hien_thi_thong_tin của san_pham2
san_pham2.hien_thi_thong_tin()

# Truy xuất thông tin của san_pham1
print(f"Tên của san_pham1: {san_pham1.ten}")
print(f"Giá của san_pham2: {san_pham2.gia}")

Trong ví dụ trên, chúng ta đã tạo hai đối tượng, san_pham1san_pham2, bằng cách gọi lớp SanPham như một hàm và truyền vào các tham số tương ứng. Mỗi đối tượng này có các thuộc tính riêng biệt, phản ánh thông tin của sản phẩm cụ thể. Sau đó, chúng ta gọi phương thức hien_thi_thong_tin của từng đối tượng để in ra thông tin của chúng. Chúng ta cũng có thể truy xuất trực tiếp các thuộc tính của đối tượng bằng cách sử dụng dấu chấm (.) như san_pham1.ten hoặc san_pham2.gia.

Điểm quan trọng cần lưu ý là mỗi đối tượng là một thực thể riêng biệt, không ảnh hưởng lẫn nhau. Việc thay đổi thuộc tính của một đối tượng sẽ không ảnh hưởng đến các đối tượng khác của cùng lớp. Điều này cho phép chúng ta tạo ra và quản lý nhiều thực thể khác nhau của cùng một loại đối tượng một cách dễ dàng. Trong Object trong lập trình Python, tính độc lập này là một yếu tố quan trọng.

Việc truyền tham số vào phương thức khởi tạo __init__ là cách chúng ta khởi tạo các thuộc tính của đối tượng khi nó được tạo. Các thuộc tính này là các biến lưu trữ thông tin của đối tượng và có thể được truy xuất hoặc thay đổi sau này. Nếu chúng ta không định nghĩa phương thức __init__, các đối tượng của lớp sẽ không có bất kỳ thuộc tính nào khi mới được tạo, trừ khi chúng ta thêm chúng vào sau.

Việc gọi các phương thức của đối tượng cũng rất đơn giản, chúng ta chỉ cần sử dụng dấu chấm (.) để gọi phương thức trên đối tượng đó. Các phương thức này là các hành động mà đối tượng có thể thực hiện và có thể truy xuất hoặc thay đổi trạng thái của đối tượng. Việc sử dụng Tạo đối tượng và các phương thức của nó giúp chúng ta tổ chức code một cách rõ ràng và dễ quản lý.

Tóm lại, việc tạo và sử dụng đối tượng là một phần không thể thiếu trong lập trình hướng đối tượng. Bằng cách tạo các đối tượng từ các lớp, chúng ta có thể tạo ra các thực thể cụ thể với các thuộc tính và hành vi riêng biệt. Điều này giúp chúng ta giải quyết các vấn đề phức tạp một cách dễ dàng và hiệu quả hơn. Hiểu rõ cách Tạo lớp và tạo đối tượng là nền tảng vững chắc để chúng ta tiếp tục khám phá các khái niệm nâng cao hơn trong lập trình hướng đối tượng.

Ở chương tiếp theo, chúng ta sẽ tìm hiểu về “Kế thừa trong Python”, một khái niệm quan trọng cho phép chúng ta tạo ra các lớp mới dựa trên các lớp đã có, kế thừa các thuộc tính và phương thức của lớp cha, đồng thời mở rộng hoặc tùy chỉnh chúng.

Conclusions

Qua bài viết này, bạn đã hiểu rõ cách tạo lớp và đối tượng trong Python. Lập trình hướng đối tượng giúp bạn tổ chức và quản lý code một cách hiệu quả, tạo ra các ứng dụng phức tạp hơn. Hãy tiếp tục thực hành và áp dụng kiến thức này để xây dựng các dự án Python thú vị!