Các lớp và đối tượng Python: Hướng dẫn OOP với các ví dụ thực tế

  1. Trang chủ
  2. Blog
  3. Phát triển phần mềm

Phát triển phần mềm

Các lớp và đối tượng Python: Hướng dẫn OOP với các ví dụ thực tế

Tìm hiểu Python hướng đối tượng bằng cách xây dựng một cái gì đó thực tế. Tạo các lớp, hiểu bản thân và __init__, chia sẻ hành vi với tính kế thừa, bảo vệ dữ liệu bằng các thuộc tính và biết khi nào một lớp là công cụ sai.

Đọc 10 phút
Các lớp và đối tượng Python: Hướng dẫn OOP với các ví dụ thực tế

Điểm chính

  • class là một bản thiết kế và object là một thứ được xây dựng từ nó.
  • __init__ thiết lập từng đối tượng mới và self đề cập đến đối tượng đó.
  • Các thuộc tính được đặt trên lớp được chia sẻ. Các thuộc tính được đặt trên self thuộc về một đối tượng.
  • Sử dụng @dataclass cho các lớp lưu giữ dữ liệu và ưu tiên các hàm đơn giản khi không có trạng thái nào cần giữ.

Khi tập lệnh phát triển, cuối cùng bạn sẽ chuyển cùng một nhóm biến giữa các hàm và thật khó để biết dữ liệu nào thuộc về logic nào. Các lớp và đối tượng Python giải quyết vấn đề này bằng cách gộp dữ liệu và hành vi vào một đơn vị.

Trong hướng dẫn này, chúng ta xây dựng một tài khoản ngân hàng nhỏ từng bước một và chỉ thêm từng ý tưởng OOP khi nó giải quyết được một vấn đề. Chúng tôi đã chạy mọi ví dụ trên Python 3.13 và kết quả hiển thị là từ lần chạy đó. Nếu bạn mới làm quen với ngôn ngữ này, trước tiên hãy đọc Hướng dẫn Python dành cho người mới bắt đầu của chúng tôi.

Lớp và đối tượng là gì?

class mô tả một thứ là gì và nó có thể làm gì. Một đối tượng, còn được gọi là một phiên bản, là một đối tượng cụ thể được tạo từ mô tả đó. “Tài khoản” là một lớp, trong khi tài khoản của Asha và tài khoản của Ben là hai đối tượng.

kỳ hạn Ý nghĩa Ví dụ
lớp học bản thiết kế Tài khoản
Đối tượng hoặc trường hợp Một thứ được làm từ nó a = Tài khoản("Asha")
Thuộc tính Dữ liệu về đối tượng a.balance
phương pháp Một hàm trên lớp a.deposit(50)

Bạn đã và đang sử dụng các đồ vật. Trong Python, chuỗi, danh sách và thậm chí cả hàm đều là đối tượng, đó là lý do tại sao bạn có thể viết "hello".upper().

Lớp học đầu tiên của bạn

class Account:
    def __init__(self, owner, balance=0):
        self.owner = owner
        self.balance = balance

    def deposit(self, amount):
        if amount <= 0:
            raise ValueError("amount must be positive")
        self.balance += amount
        return self.balance

a = Account("Asha", 100)
b = Account("Ben")

a.deposit(50)
print(a.balance, b.balance)

# 150 0

__init__ tự động chạy bất cứ khi nào bạn tạo một đối tượng và nó đặt trạng thái bắt đầu. Việc gửi vào a không chạm vào b, vì mỗi đối tượng đều có dữ liệu riêng. Lưu ý rằng phương pháp này cũng bảo vệ số dư khỏi giá trị xấu. Hướng dẫn của chúng tôi về Xử lý ngoại lệ Python giải thích raise chi tiết hơn.

Bản thân là gì?

self chỉ đơn giản là đối tượng mà một phương thức đang hoạt động. Khi bạn viết a.deposit(50), Python gọi Account.deposit(a, 50) một cách hiệu quả, chuyển đối tượng vào làm đối số đầu tiên. Đó là cách định nghĩa một phương thức có thể phục vụ mọi đối tượng.

Tên self là một quy ước mạnh mẽ hơn là một từ khóa, nhưng hãy luôn sử dụng nó. Việc quên nó trong định nghĩa phương thức là lỗi phổ biến nhất dành cho người mới bắt đầu và nó tạo ra một thông báo khó hiểu về số lượng đối số.

Thuộc tính lớp so với thuộc tính thể hiện

Một thuộc tính được đặt trực tiếp trong nội dung lớp được chia sẻ bởi tất cả các đối tượng. Một tập hợp trên self chỉ thuộc về đối tượng đó. Ví dụ này cho thấy cách tra cứu hoạt động:

class Account:
    interest_rate = 0.04    # class attribute

    def __init__(self, owner, balance=0):
        self.owner = owner  # instance attribute
        self.balance = balance

a = Account("Asha", 100)
b = Account("Ben")
print(a.interest_rate, b.interest_rate)   # 0.04 0.04

Account.interest_rate = 0.05
print(a.interest_rate, b.interest_rate)   # 0.05 0.05

a.interest_rate = 0.09
print(a.interest_rate, b.interest_rate, Account.interest_rate)
# 0.09 0.05 0.05

Dòng cuối cùng đó làm mọi người ngạc nhiên. Việc chỉ định thông qua a không thay đổi giá trị được chia sẻ. Nó tạo ra một thuộc tính thể hiện mới trên a để ẩn lớp một. Python nhìn vào đối tượng trước, sau đó là lớp.

Các phương pháp đặc biệt (dunder)

Các phương thức có dấu gạch dưới kép cho phép đối tượng của bạn hoạt động với các tính năng tích hợp sẵn của Python. Không có chúng, việc in tài khoản sẽ hiển thị một địa chỉ bộ nhớ vô dụng. Việc thêm hai sẽ cho nó một dạng có thể đọc được:

    def __str__(self):
        return f"{self.owner}: {self.balance}"

    def __repr__(self):
        return f"Account({self.owner!r}, {self.balance})"

print(a)        # Asha: 150
print([a, b])   # [Account('Asha', 150), Account('Ben', 0)]
phương pháp Kích hoạt bởi
__init__ Tạo một đối tượng
__str__ print(obj), str(obj)
__repr__ Gỡ lỗi hoặc hiển thị nó trong danh sách
__eq__ một == b
__len__ len(obj)
__add__ a + b

Kế thừa

Tính kế thừa cho phép một lớp mới sử dụng lại lớp hiện có và chỉ thay đổi những gì khác biệt. Ở đây, Savings là Account có cài đặt bổ sung:

class Savings(Account):
    def __init__(self, owner, balance=0, limit=3):
        super().__init__(owner, balance)
        self.limit = limit

    def __str__(self):
        return f"{super().__str__()} (savings)"

s = Savings("Chitra", 500)
s.deposit(100)
print(s, isinstance(s, Account), s.limit)

# Chitra: 600 (savings) True 3

super() gọi phiên bản gốc nên logic thiết lập không bị lặp lại. deposit vẫn được kế thừa và __str__ được ghi đè để thêm nhãn. Chỉ sử dụng tính kế thừa cho mối quan hệ “là” thực sự. Nếu một lớp chỉ cần một thứ gì đó, chẳng hạn như một chiếc ô tô cần động cơ, hãy cung cấp cho nó đối tượng đó làm thuộc tính. Điều này được gọi là sự kết hợp và nó thường linh hoạt hơn các chuỗi kế thừa sâu.

Đa hình

Tính đa hình có nghĩa là các đối tượng khác nhau có thể đáp ứng cùng một lệnh gọi phương thức theo cách riêng của chúng. Mã gọi không cần biết chính xác loại:

class Square:
    def __init__(self, side):
        self.side = side
    def area(self):
        return self.side ** 2

class Circle:
    def __init__(self, radius):
        self.radius = radius
    def area(self):
        return round(3.14159 * self.radius ** 2, 2)

for shape in [Square(3), Circle(2)]:
    print(type(shape).__name__, shape.area())

# Square 9
# Circle 12.57

Hai lớp này thậm chí không có chung cha mẹ. Python chỉ quan tâm đến việc đối tượng có một phương thức area, một cách tiếp cận được gọi là gõ vịt. Việc thêm Triangle sau sẽ không cần thay đổi vòng lặp.

Đóng gói và thuộc tính

Python không có thuộc tính thực sự riêng tư và thay vào đó nó dựa vào các quy ước. Một dấu gạch dưới duy nhất, như trong_price, nói với các nhà phát triển khác “đây là nội bộ, vui lòng không chạm vào”. Để kiểm tra các giá trị khi chúng được đặt, hãy sử dụngtài sản, trông giống như một thuộc tính đơn giản từ bên ngoài:

class Product:
    def __init__(self, price):
        self.price = price

    @property
    def price(self):
        return self._price

    @price.setter
    def price(self, value):
        if value < 0:
            raise ValueError("price cannot be negative")
        self._price = value

p = Product(100)
p.price = 150
print(p.price)      # 150
p.price = -5        # ValueError: price cannot be negative

Điều này có nghĩa là bạn có thể bắt đầu với một thuộc tính đơn giản và thêm xác thực sau mà không cần thay đổi bất kỳ mã nào sử dụng lớp đó. Vì vậy, đừng viết các phương thức get_price() và set_price() theo thói quen, như bạn có thể làm trong Java. Cú pháp @ ở đây là một trình trang trí, được chúng tôi giải thích trong Các trình trang trí Python được giải thích.

Phương thức lớp và phương thức tĩnh

class Temperature:
    def __init__(self, celsius):
        self.celsius = celsius

    @classmethod
    def from_fahrenheit(cls, f):
        return cls(round((f - 32) * 5 / 9, 1))

    @staticmethod
    def is_freezing(celsius):
        return celsius <= 0

Temperature.from_fahrenheit(212).celsius   # 100.0
Temperature.is_freezing(-3)                # True
Loại Đối số đầu tiên Sử dụng nó cho
Phương thức sơ thẩm tự Làm việc với dữ liệu của một đối tượng
@classmethod cls Nhà xây dựng thay thế
@staticmethod không có Những người trợ giúp liên quan đến lớp

Lớp dữ liệu

Khi một lớp chủ yếu chứa dữ liệu, việc viết __init__, __repr__ và __eq__ bằng tay rất tẻ nhạt. @dataclass tạo chúng từ các chú thích kiểu:

from dataclasses import dataclass, field

@dataclass
class Item:
    name: str
    price: int
    tags: list = field(default_factory=list)

print(Item("Pen", 10))
print(Item("Pen", 10) == Item("Pen", 10))

# Item(name='Pen', price=10, tags=[])
# True

Mẹo: Không phải mọi thứ đều cần có lớp học. Nếu nó không có trạng thái và chỉ có một hành vi thì một hàm đơn giản sẽ đơn giản hơn. Đối với những tra cứu đơn giản, từ điển có thể là đủ. Hãy tiếp cận một lớp khi dữ liệu và các quy tắc bảo vệ nó rõ ràng thuộc về nhau.

Những lỗi thường gặp

Sử dụng thuộc tính lớp có thể thay đổi

Đây là một lỗi cổ điển. Danh sách được xác định trên lớp, vì vậy tất cả các xe đều chia sẻ nó:

class Cart:
    items = []            # shared by every cart!

    def add(self, item):
        self.items.append(item)

c1, c2 = Cart(), Cart()
c1.add("pen")
print(c2.items)

# ['pen']

Tạo nó trong __init__ với self.items = [], để mọi đối tượng đều có danh sách riêng.

Các lỗi phổ biến khác

  • Quên self. Viết self.balance, không phải balance, bên trong các phương thức.
  • Quên super().__init__(). Sau đó, đứa trẻ sẽ bỏ lỡ các thuộc tính do cha mẹ thiết lập.
  • Xây dựng các lớp học lớn. Một lớp làm được mọi thứ rất khó để kiểm tra. Hãy chia nó ra theo trách nhiệm.
  • Kế thừa sâu sắc. Hai cấp độ thường nhiều và bố cục thường rõ ràng hơn.
  • Không viết bài kiểm tra. Các lớp có quy tắc rất dễ kiểm tra, như hướng dẫn pytest của chúng tôi hiển thị bằng cách sử dụng một chiếc xe đẩy nhỏ.

Lời kết

Python hướng đối tượng tập trung vào việc nhóm dữ liệu với hành vi bảo vệ dữ liệu đó. Bắt đầu với __init__, các phương thức và __str__, sau đó thêm tính kế thừa và thuộc tính khi bạn gặp vấn đề mà chúng giải quyết được. Bước tiếp theo, hãy lấy một tập lệnh chuyển một số biến giống nhau ở mọi nơi và biến chúng thành một lớp nhỏ.

Câu hỏi thường gặp

Sự khác biệt giữa một lớp và một đối tượng là gì?

Một lớp là định nghĩa hoặc bản thiết kế. Một đối tượng là một thể hiện cụ thể được tạo ra từ nó, với dữ liệu riêng của nó. Một lớp có thể tạo nhiều đối tượng.

__init__ làm gì trong Python?

Nó là trình khởi tạo, chạy tự động khi bạn tạo một đối tượng. Nó thường đặt các thuộc tính bắt đầu của đối tượng từ các đối số bạn truyền vào.

Bản thân trong Python là gì?

self đề cập đến đối tượng mà phương thức được gọi. Python tự động chuyển nó và cho phép phương thức đọc và thay đổi các thuộc tính của đối tượng đó.

Bốn trụ cột của OOP là gì?

Chúng là sự đóng gói, trừu tượng, kế thừa và đa hình. Cùng nhau, chúng giúp bạn kết hợp dữ liệu với hành vi, ẩn chi tiết và sử dụng lại mã.

Khi nào tôi nên sử dụng lớp thay vì hàm?

Sử dụng một lớp khi dữ liệu và hành vi thuộc về nhau trong một số thao tác. Đối với một hoạt động không trạng thái, một hàm đơn giản sẽ đơn giản và dễ kiểm tra hơn.

Tiếp tục học hỏi

Làm việc với Stack Quora

Cần trợ giúp về kiểm tra, WordPress hoặc SEO?

Chúng tôi giúp các nhóm phát triển phần mềm tốt hơn và phát triển trang web của họ. Hãy cho chúng tôi biết bạn đang làm gì và chúng tôi sẽ đề xuất bước tiếp theo rõ ràng.

Tiếp tục đọc

Thêm hướng dẫn về thử nghiệm, AI và phát triển hiện đại

Bạn thích bài viết này? Chọn một chủ đề và chuyển ngay sang phần hướng dẫn mới nhất của chúng tôi.

Trí tuệ nhân tạo

Giải thích về ảo giác AI: Tại sao các mô hình ngôn ngữ lại tạo nên mọi thứ và cách giảm thiểu nó

Ảo giác AI đã giải thích: chúng là gì, tại sao mô hình ngôn ngữ tạo ra chúng, các loại phổ biến, cách giảm thiểu chúng bằng cách căn cứ và nhắc nhở …

Đọc bài viết →
DevOps

Giải thích về các biến môi trường: Tệp .env, bí mật và cấu hình được thực hiện đúng

Các biến môi trường được giải thích bằng các ví dụ Python mà chúng tôi đã chạy: đọc và thiết lập chúng, tại sao mọi giá trị đều là một chuỗi, tệp .e…

Đọc bài viết →
Phát triển phần mềm

Giải thích về giới hạn tỷ lệ API: Thuật toán, tiêu đề và xử lý lỗi 429

Giới hạn tốc độ API được giải thích bằng mô phỏng mà chúng tôi đã chạy: nhóm mã thông báo, cửa sổ cố định, cửa sổ trượt, 429 phản hồi, tiêu đề giới …

Đọc bài viết →
Tự động hóa kiểm thử

Chế giễu bằng Python: unittest.mock, patch và những sai lầm khiến bài kiểm tra nói dối

Mô phỏng bằng Python với unittest.mock, đã được thử nghiệm: Mock và return_value, side_effect, vá lỗi nơi sử dụng tên, thông số kỹ thuật và thông số…

Đọc bài viết →
Kiểm thử phần mềm

Giải thích về phạm vi bảo hiểm của mã: Phạm vi tuyến so với chi nhánh và ý nghĩa thực sự 100%

Phạm vi bảo hiểm mã được giải thích bằng cách chạy phạm vi bảo hiểm thực tế: phạm vi bảo hiểm dòng, chi nhánh và điều kiện, đọc báo cáo, lý do tại s…

Đọc bài viết →
Cơ sở dữ liệu & SQL

DELETE vs TRUNCATE vs DROP trong SQL: Sự khác biệt, khôi phục và thời điểm sử dụng mỗi loại

DELETE vs TRUNCATE vs DROP được giải thích bằng SQL đã được thử nghiệm: mỗi loại loại bỏ, khôi phục, kích hoạt, đặt lại danh tính, tốc độ và Postgre…

Đọc bài viết →
Cơ sở dữ liệu & SQL

Giải thích về Chế độ xem SQL: Tạo, sử dụng và tránh những cạm bẫy, kèm theo ví dụ

Chế độ xem SQL được giải thích bằng các truy vấn chúng tôi đã chạy: tạo chế độ xem, kết quả trực tiếp, ẩn cột, hiệu suất, chế độ xem có thể cập nhật…

Đọc bài viết →
Phát triển phần mềm

Giao diện TypeScript so với loại: Sự khác biệt thực sự, được thử nghiệm bằng trình biên dịch

Giao diện TypeScript so với loại, được kiểm tra bằng trình biên dịch thực: cả hai có thể làm gì, chỉ một người có thể làm gì, hợp nhất khai báo, mở …

Đọc bài viết →
Phát triển phần mềm

Giải thích về Python *args và **kwargs: Hàm linh hoạt với ví dụ rõ ràng

Python *args và **kwargs được giải thích bằng mã chúng tôi đã chạy: đóng gói và giải nén, thứ tự tham số, đối số chỉ từ khóa và chỉ vị trí, trình tr…

Đọc bài viết →
Phát triển phần mềm

Hàm Lambda của Python: Cú pháp, cách sử dụng thực tế và khi nào không nên sử dụng chúng

Các hàm lambda của Python được giải thích bằng mã chúng tôi đã chạy: cú pháp, sắp xếp bằng khóa, bản đồ và bộ lọc, các phần đóng, bẫy liên kết muộn …

Đọc bài viết →
Trí tuệ nhân tạo

Đại lý AI là gì? Cách chúng hoạt động, với vòng lặp tác nhân đơn giản, bạn có thể chạy

Tác nhân AI là gì? Hướng dẫn đơn giản về vòng lặp tác nhân, công cụ, bộ nhớ và lan can, với một vòng lặp Python nhỏ mà chúng tôi đã chạy, những rủi …

Đọc bài viết →
DevOps

Giám sát và Khả năng quan sát: Sự khác biệt thực sự, với nhật ký, số liệu và dấu vết

Giải thích về giám sát và khả năng quan sát: lỗi đã biết và chưa biết, nhật ký, số liệu và dấu vết, hướng dẫn về sự cố thanh toán, tín hiệu vàng, Op…

Đọc bài viết →
DevOps

Docker Volumes vs Bind Mounts: Duy trì dữ liệu vùng chứa đúng cách

Giải thích về khối lượng Docker và liên kết gắn kết: tại sao dữ liệu vùng chứa biến mất, khối lượng được đặt tên, liên kết gắn kết, tmpfs, ví dụ về …

Đọc bài viết →
Tự động hóa kiểm thử

TDD vs BDD: Key Differences, One Feature Built Both Ways and When to Use Each

TDD và BDD được giải thích bằng một tính năng giảm giá được xây dựng theo cả hai cách: tái cấu trúc màu đỏ-xanh với mã chúng tôi đã chạy, kịch bản C…

Đọc bài viết →
Kiểm thử phần mềm

Kiểm tra chấp nhận của người dùng (UAT): Quy trình, danh sách kiểm tra và ví dụ thực tế

Giải thích về thử nghiệm chấp nhận của người dùng: ai chạy nó, nó khác với QA như thế nào, quy trình bảy bước, mẫu trường hợp thử nghiệm UAT, danh s…

Đọc bài viết →
Cơ sở dữ liệu & SQL

Giải thích về các giá trị NULL của SQL: IS NULL, COALESCE, NULLIF và những cái bẫy cần tránh

Các giá trị SQL NULL được giải thích bằng các truy vấn chúng tôi đã chạy: logic ba giá trị, IS NULL, COALESCE, NULLIF, cách tổng hợp, kết hợp và sắp…

Đọc bài viết →
Cơ sở dữ liệu & SQL

Câu lệnh SQL CASE WHEN: Cú pháp, ví dụ thực tế và các lỗi thường gặp

TRƯỜNG HỢP SQL KHI được giải thích bằng các truy vấn mà chúng tôi đã chạy: các biểu mẫu đơn giản và được tìm kiếm, thứ tự điều kiện, các thủ thuật S…

Đọc bài viết →
Phát triển phần mềm

JWT là gì? Mã thông báo Web JSON được giải thích bằng một ví dụ hoạt động

JWT là gì? Mã thông báo Web JSON đã giải thích: ba phần, mã thông báo được xây dựng và giả mạo trong mã chúng tôi đã chạy, JWT so với phiên, lưu trữ…

Đọc bài viết →
Phát triển phần mềm

Giải thích về vòng lặp sự kiện JavaScript: Ngăn xếp cuộc gọi, Microtask và bộ hẹn giờ kèm ví dụ

Vòng lặp sự kiện JavaScript được giải thích bằng mã chúng tôi đã chạy: ngăn xếp cuộc gọi, hàng đợi tác vụ và vi nhiệm, tại sao setTimeout 0 không di…

Đọc bài viết →
Phát triển phần mềm

Giải thích về trình tạo và năng suất của Python: Tiết kiệm bộ nhớ bằng các ví dụ thực tế

Trình tạo và lợi nhuận Python được giải thích bằng mã chúng tôi đã chạy: cách chúng tạm dừng và tiếp tục, đo mức tiết kiệm bộ nhớ, quy trình, chuỗi …

Đọc bài viết →
Trí tuệ nhân tạo

Nhúng là gì? Giải thích sự tương đồng về vectơ và Cosine một cách đơn giản

nhúng là gì? Hướng dẫn bằng ngôn ngữ đơn giản về vectơ, độ tương tự cosine và tìm kiếm ngữ nghĩa, với một ví dụ nhỏ mà chúng tôi đã chạy, các cách s…

Đọc bài viết →
DevOps

Triển khai Blue-Green và Canary: Sự khác biệt, sự đánh đổi và cách lựa chọn

Giải thích về triển khai Blue-green và Canary: cách hoạt động của từng loại, chi phí, rủi ro và khôi phục, nhóm người dùng ổn định mà chúng tôi đã t…

Đọc bài viết →
Tự động hóa kiểm thử

Kiểm tra không ổn định: Nguyên nhân gây ra chúng và cách khắc phục chúng vĩnh viễn

Các thử nghiệm không ổn định được giải thích bằng các bản demo mà chúng tôi đã chạy: nguyên nhân chính, cách xác nhận và chẩn đoán nguyên nhân, cách…

Đọc bài viết →
Kiểm thử phần mềm

Kiểm tra tải và kiểm tra căng thẳng: Sự khác biệt, số liệu và ví dụ về k6

Giải thích về thử nghiệm tải và thử nghiệm căng thẳng: mỗi thử nghiệm chứng minh điều gì, thử nghiệm tăng đột biến và ngâm, số liệu quan trọng, lý d…

Đọc bài viết →
Kiểm thử phần mềm

Trường hợp thử nghiệm và kịch bản thử nghiệm: Sự khác biệt chính, ví dụ và thời điểm sử dụng từng trường hợp

Giải thích trường hợp kiểm thử và kịch bản kiểm thử: định nghĩa rõ ràng, bảng cạnh nhau, một tính năng đặt lại mật khẩu được lấy từ các tình huống n…

Đọc bài viết →
Cơ sở dữ liệu & SQL

Tối ưu hóa truy vấn SQL: Đọc kế hoạch thực thi và sửa các truy vấn chậm, có tính thời gian

Đã thử nghiệm tối ưu hóa truy vấn SQL trên một triệu hàng: đọc kế hoạch thực hiện, thêm chỉ mục phù hợp, sửa các bộ lọc không thể mở rộng, sử dụng c…

Đọc bài viết →
Cơ sở dữ liệu & SQL

SQL UNION và UNION ALL: Sự khác biệt, ví dụ và hiệu suất đã được kiểm tra

SQL UNION và UNION ALL được giải thích bằng các truy vấn chúng tôi đã chạy: trùng lặp, cả hai quy tắc đều tuân theo, lỗi dữ liệu thực, hiệu suất đượ…

Đọc bài viết →
Phát triển phần mềm

Hướng dẫn API tìm nạp JavaScript: GET, POST, Xử lý lỗi và hết thời gian chờ

Hướng dẫn API tìm nạp JavaScript đã được thử nghiệm trên máy chủ cục bộ: GET và POST, tại sao 404 không gửi, trình trợ giúp có thể sử dụng lại, chuỗ…

Đọc bài viết →
Phát triển phần mềm

Xử lý tệp Python: Đọc, ghi, CSV, JSON và pathlib kèm ví dụ

Việc xử lý tệp Python được giải thích bằng mã chúng tôi đã chạy: chế độ mở, với, đọc tệp lớn, CSV, JSON, pathlib, tệp nhị phân, ghi an toàn, xử lý l…

Đọc bài viết →
Phát triển phần mềm

Các lớp và đối tượng Python: Hướng dẫn OOP với các ví dụ thực tế

Các lớp và đối tượng Python được giải thích bằng mã mà chúng tôi đã chạy: __init__, các phương thức, thuộc tính lớp và phiên bản, tính kế thừa, thuộ…

Đọc bài viết →
Trí tuệ nhân tạo

Mô hình ngôn ngữ lớn là gì? LLM hoạt động như thế nào, được giải thích mà không cường điệu hóa

Mô hình ngôn ngữ lớn là gì? LLM được giải thích bằng ngôn ngữ đơn giản: mã thông báo, phần nhúng, sự chú ý, đào tạo, cửa sổ nhiệt độ và ngữ cảnh, mộ…

Đọc bài viết →
DevOps

Các lệnh Linux cho người mới bắt đầu: Hướng dẫn thiết bị đầu cuối cần thiết kèm ví dụ

Các lệnh Linux dành cho người mới bắt đầu, được nhóm theo tác vụ: điều hướng, tệp, xem nhật ký, grep, đường dẫn, quyền, quy trình và lưu trữ, cùng v…

Đọc bài viết →
Tự động hóa kiểm thử

Selenium vs Nhà viết kịch: Sự khác biệt chính, So sánh mã và nên chọn cái nào

Selenium và Playwright được so sánh: kiến trúc, chờ đợi, hỗ trợ trình duyệt và ngôn ngữ, gỡ lỗi, kiểm tra giống nhau ở cả hai công cụ, lời khuyên di…

Đọc bài viết →
Kiểm thử phần mềm

Phân vùng tương đương: Giải thích kỹ thuật thiết kế thử nghiệm bằng các ví dụ đã thực hiện

Giải thích về phân vùng tương đương: cách tìm các phân vùng hợp lệ và không hợp lệ, các ví dụ hoạt động theo độ tuổi, mật khẩu và phiếu giảm giá, cá…

Đọc bài viết →
Kiểm thử phần mềm

Mức độ nghiêm trọng và mức độ ưu tiên trong kiểm thử phần mềm: Sự khác biệt, Ma trận và ví dụ thực tế

Giải thích về mức độ nghiêm trọng và mức độ ưu tiên trong kiểm thử phần mềm: định nghĩa rõ ràng, ma trận bốn chiều với các ví dụ, thang đo cấp độ, a…

Đọc bài viết →
Cơ sở dữ liệu & SQL

Hướng dẫn về truy vấn con SQL: Các loại, truy vấn con tương quan và TỒN TẠI kèm ví dụ

Hướng dẫn về truy vấn con SQL với các truy vấn chúng tôi đã chạy: truy vấn con vô hướng, IN, FROM và SELECT, truy vấn con tương quan, EXISTS, bẫy và…

Đọc bài viết →
Cơ sở dữ liệu & SQL

Giải thích về giao dịch SQL và ACID: Các mức CAM KẾT, ROLLBACK và Cô lập

Các giao dịch SQL và ACID được giải thích bằng chuyển khoản ngân hàng mà chúng tôi đã thực hiện: CAM KẾT, ROLLBACK, điểm lưu trữ, khóa, mức cách ly,…

Đọc bài viết →
Phát triển phần mềm

Git merge vs rebase: khác biệt, ví dụ và khi nào dùng cái nào

Git merge vs rebase được giải thích bằng đầu ra log thực tế, bảng so sánh, quy tắc vàng của rebase và quy trình làm việc nhóm an toàn.

Đọc bài viết →
Phát triển phần mềm

List comprehension trong Python: cú pháp, ví dụ và khi nào nên tránh

List comprehension trong Python: cú pháp, lọc dữ liệu, if-else, vòng lặp lồng nhau, thời gian đo thực tế và khi nào vòng lặp for thông thường tốt hơn.

Đọc bài viết →
Cơ sở dữ liệu & SQL

Giải thích SQL JOIN kèm ví dụ (Inner, Left, Right, Full)

Hiểu SQL JOIN từng bước với bảng và truy vấn mẫu: INNER, LEFT, RIGHT, FULL, CROSS và SELF, cùng lỗi thường gặp và mẹo hiệu năng.

Đọc bài viết →