Tại sao Python sử dụng 'Self' làm đối số mặc định

Category: Python

Trong Python, khi định nghĩa các phương thức trong một lớp, tham số đầu tiên luôn là self. Tham số self là một quy ước chứ không phải là một từ khóa và nó đóng vai trò quan trọng trong cấu trúc hướng đối tượng của Python .

Ví dụ:

class Car:
    def __init__(self, brand, model):
        self.brand = brand  # Gán thuộc tính thương hiệu cho đối tượng
        self.model = model  # Gán thuộc tính mẫu xe cho đối tượng

    def display(self):
        return self.brand, self.model

# Tạo một đối tượng Car
car1 = Car("Toyota", "Corolla")

# Gọi phương thức display
print(car1.display())  # Kết quả: ('Toyota', 'Corolla')

Đầu ra:

('Toyota', 'Corolla')

Giải thích:

  • self trong init: Được sử dụng để gán giá trị (thương hiệu và kiểu máy) cho phiên bản cụ thể (car1).

  • self trong display_info: Tham chiếu đến cùng một thể hiện car1 để truy cập các thuộc tính của nó (thương hiệu và kiểu máy).

  • Python tự động truyền car1 làm đối số đầu tiên để hiển thị.

Hãy cùng tìm hiểu chi tiết về cách sử dụng self làm đối số mặc định trong Python:

Tại sao Python sử dụng 'Self' làm đối số mặc định?

Lý do chính khiến Python sử dụng self làm đối số mặc định là để làm cho lập trình hướng đối tượng trở nên rõ ràng hơn là ngầm định. Bằng cách yêu cầu thể hiện của lớp được truyền rõ ràng làm tham số đầu tiên cho mọi phương thức thể hiện, Python đảm bảo rằng mã rõ ràng và không mơ hồ. Cách tiếp cận rõ ràng này làm cho các phương thức hoạt động trên một thể hiện của lớp trở nên rõ ràng ngay lập tức, giúp tăng khả năng đọc mã và tránh nhầm lẫn, đặc biệt là trong các tình huống kế thừa phức tạp.

Tại sao không ngầm hiểu?

Không giống như một số ngôn ngữ lập trình khác, Python yêu cầu self một cách rõ ràng vì:

  • Rõ ràng: Rõ ràng thì tốt hơn ngầm hiểu (triết lý của Python).

  • Tính linh hoạt: Bạn có thể đặt tên bất cứ thứ gì, nhưng self là một quy ước.

  • Tính nhất quán: Tất cả các phương thức thể hiện trong Python đều sử dụng cách tiếp cận này, làm cho nó trở nên thống nhất.

Ví dụ 1: Khởi tạo đối tượng và gọi phương thức

class gfg:
    def __init__(self, topic):
        self._topic = topic  # Đổi tên biến thể hiện để tránh xung đột

    def topic(self):
        print("Topic:", self._topic)  # Truy cập biến đã đổi tên

# Tạo một đối tượng của lớp gfg
ins = gfg("Python")

# Gọi phương thức topic
ins.topic()

Đầu ra:

Topic: Python

Giải thích: Trong ví dụ này, 'self' được sử dụng để tham chiếu đến thể hiện của lớp 'ins'. Nếu không sử dụng 'self' một cách rõ ràng, sẽ không rõ phương thức này đang tham chiếu đến thể hiện nào và mã có thể trở nên mơ hồ.

Ví dụ 2: Lớp Circle để tính diện tích

Trong ví dụ này, 'self' rất quan trọng để truy cập thuộc tính 'r' của thể hiện cụ thể ' ins '. Việc sử dụng 'self' đảm bảo rằng phương thức hoạt động trên các thuộc tính của thể hiện chính xác.

class Circle:
    def __init__(self, r):
        self.r = r

    def area(self):
        a = 3.14 * self.r ** 2
        return a

# Tạo một đối tượng của lớp Circle
ins = Circle(5)

# Gọi phương thức area
print("Area of the circle:", ins.area())

Đầu ra:

Area of the circle: 78,5

Published on Jun 17, 2025