Khóa học python

Constructors trong Python

0 phút đọc

Constructors là một khái niệm quan trọng trong lập trình hướng đối tượng (OOP) và được sử dụng để khởi tạo các đối tượng của một lớp. Trong Python, constructors là các phương thức đặc biệt được gọi tự động khi một đối tượng của lớp được tạo ra. Constructors giúp đảm bảo rằng các đối tượng được khởi tạo với trạng thái hợp lệ và có thể sử dụng ngay lập tức.

Các Loại Constructors trong Python

Trong Python, có ba loại constructors chính:

  1. Default Constructor: Constructor mặc định không nhận bất kỳ tham số nào ngoài self.
  2. Non-parameterized Constructor: Constructor không tham số, được định nghĩa bởi lập trình viên nhưng không nhận tham số nào ngoài self.
  3. Parameterized Constructor: Constructor có tham số, nhận một hoặc nhiều tham số để khởi tạo các biến instance của lớp.

Default Constructor

Default constructor là constructor đơn giản nhất và không nhận bất kỳ tham số nào. Python tự động tạo ra một default constructor nếu không có constructor nào được định nghĩa trong lớp.

Ví dụ:

class MyClass:
    def __init__(self):
        self.value = 0

# Tạo đối tượng của lớp MyClass
obj = MyClass()
print(obj.value)  # Output: 0

Trong ví dụ trên, __init__ là default constructor và khởi tạo biến instance value với giá trị 0.

Non-parameterized Constructor

Non-parameterized constructor là constructor không nhận tham số nào ngoài self. Nó được sử dụng để thiết lập các giá trị mặc định cho các biến instance của lớp.

Ví dụ:

class Person:
    def __init__(self):
        self.name = "John"
        self.age = 20

# Tạo đối tượng của lớp Person
p = Person()
print("Name:", p.name)  # Output: Name: John
print("Age:", p.age)    # Output: Age: 20

Trong ví dụ trên, __init__ là non-parameterized constructor và khởi tạo các biến instance nameage với các giá trị mặc định.

Parameterized Constructor

Parameterized constructor là constructor nhận một hoặc nhiều tham số để khởi tạo các biến instance của lớp. Điều này cho phép tùy chỉnh trạng thái ban đầu của đối tượng khi nó được tạo ra.

Ví dụ:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

# Tạo đối tượng của lớp Person với các giá trị tùy chỉnh
person1 = Person("Alice", 30)
person2 = Person("Bob", 25)

print(person1.name, person1.age)  # Output: Alice 30
print(person2.name, person2.age)  # Output: Bob 25

Trong ví dụ trên, __init__ là parameterized constructor và nhận hai tham số nameage để khởi tạo các biến instance tương ứng.

Sử Dụng self trong Constructors

Trong Python, self là tham số đầu tiên của bất kỳ phương thức nào trong lớp, bao gồm cả constructors. self đại diện cho đối tượng hiện tại của lớp và được sử dụng để truy cập các biến instance và phương thức của lớp.

Ví dụ:

class Car:
    def __init__(self, make, model):
        self.make = make
        self.model = model

    def display_info(self):
        print(f"Car make: {self.make}, Model: {self.model}")

# Tạo đối tượng của lớp Car
car1 = Car("Toyota", "Corolla")
car1.display_info()  # Output: Car make: Toyota, Model: Corolla

Trong ví dụ trên, self được sử dụng để truy cập các biến instance makemodel trong phương thức display_info.

Constructor Overloading trong Python

Python không hỗ trợ constructor overloading theo cách truyền thống như các ngôn ngữ khác (ví dụ: C++ hoặc Java). Tuy nhiên, bạn có thể đạt được hành vi tương tự bằng cách sử dụng các giá trị mặc định cho các tham số hoặc kiểm tra số lượng và loại tham số trong constructor.

Ví dụ:

class MyClass:
    def __init__(self, name=None):
        if name is None:
            print("Default constructor called")
        else:
            self.name = name
            print(f"Parameterized constructor called with name {self.name}")

# Tạo đối tượng của lớp MyClass
obj1 = MyClass()  # Output: Default constructor called
obj2 = MyClass("John")  # Output: Parameterized constructor called with name John

Trong ví dụ trên, constructor kiểm tra xem tham số name có được cung cấp hay không và thực hiện hành vi tương ứng.

Constructor Chaining trong Python

Constructor chaining là kỹ thuật gọi một constructor từ một constructor khác trong cùng một lớp hoặc từ lớp cơ sở. Trong Python, bạn có thể sử dụng hàm super() để gọi constructor của lớp cơ sở.

Ví dụ:

class Base:
    def __init__(self, name):
        self.name = name
        print(f"Base constructor called with name {self.name}")

class Derived(Base):
    def __init__(self, name, age):
        super().__init__(name)
        self.age = age
        print(f"Derived constructor called with age {self.age}")

# Tạo đối tượng của lớp Derived
d = Derived("Alice", 30)
# Output:
# Base constructor called with name Alice
# Derived constructor called with age 30

Trong ví dụ trên, constructor của lớp Derived gọi constructor của lớp Base bằng cách sử dụng super().

Các Lợi Ích của Constructors

Constructors mang lại nhiều lợi ích trong lập trình hướng đối tượng:

  1. Khởi tạo đối tượng: Constructors đảm bảo rằng các đối tượng được khởi tạo với trạng thái hợp lệ.
  2. Tính nhất quán: Constructors giúp duy trì tính nhất quán của các đối tượng bằng cách thiết lập các giá trị mặc định hoặc tùy chỉnh.
  3. Tính linh hoạt: Parameterized constructors cho phép tạo các đối tượng với các giá trị khác nhau, tăng tính linh hoạt của lớp.
  4. Tính đóng gói: Constructors giúp đóng gói logic khởi tạo trong một phương thức duy nhất, cải thiện tính rõ ràng và bảo trì của mã nguồn.

Kết Luận

Constructors là một khái niệm quan trọng trong lập trình hướng đối tượng và đóng vai trò quan trọng trong việc khởi tạo các đối tượng của lớp. Python cung cấp ba loại constructors chính: default constructor, non-parameterized constructor, và parameterized constructor. Hiểu và sử dụng đúng các loại constructors này sẽ giúp bạn viết mã nguồn rõ ràng, dễ bảo trì và hiệu quả hơn. Hy vọng bài viết này đã cung cấp cho bạn một cái nhìn tổng quan và chi tiết về constructors trong Python.

Avatar
Được viết bởi

TechMely Team

Gợi ý câu hỏi phỏng vấn

entry

Liệt kê các kiểu dữ liệu trong Python?

entry

Biến cục bộbiến toàn cục trong Python là gì?

entry

Trong Python có những built-in types nào?

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào