Chuyển đến nội dung chính

Lớp bên trong trong Python

Trong hướng dẫn Python cơ bản này, bạn sẽ tìm hiểu lý do và thời điểm nên dùng lớp bên trong.
· 5 phút đọc

Khám phá cùng AI

Có lẽ bạn đã từng nghe về hàm lồng nhau trong Python. Nếu bạn hiểu khái niệm đó thì việc nắm bắt lớp bên trong/lồng nhau sẽ rất đơn giản. Chúng ta sẽ khám phá một vài điểm mới về các lớp bên trong hoặc lồng nhau ở đây.

1. Lớp bên trong hoặc lồng nhau

Lớp bên trong hoặc lồng nhau được định nghĩa bên trong một lớp khác. Xem cấu trúc của lớp bên trong hoặc lồng nhau.

## outer class
class Outer:

    ## inner class
    class Inner:
        pass

        ## multilevel inner class
        class InnerInner:
            pass

    ## another inner class
    class _Inner:
        pass

    ## ...

    pass

Chạy và chỉnh sửa mã từ hướng dẫn trực tuyến này

Chạy mã

2. Vì sao dùng lớp bên trong?

  1. Nhóm hai hoặc nhiều lớp với nhau. Giả sử bạn có hai lớp Car và Engine. Mỗi Car đều cần một Engine. Nhưng Engine sẽ không được dùng nếu không có Car. Vì vậy, bạn biến Engine thành lớp bên trong của Car. Cách này giúp tiết kiệm mã.

  2. Ẩn mã là một công dụng khác của lớp lồng nhau. Bạn có thể ẩn lớp lồng nhau khỏi thế giới bên ngoài.

  3. Dễ hiểu hơn về các lớp. Các lớp có liên quan chặt chẽ ở đây. Bạn không phải tìm kiếm các lớp rải rác trong mã; chúng nằm cùng một chỗ.

Các lớp bên trong hoặc lồng nhau không phải là tính năng được dùng phổ biến nhất trong Python. Tuy vậy, đây có thể là một tính năng hữu ích để triển khai mã. Khi dùng lớp bên trong hoặc lồng nhau, mã rất dễ tổ chức.

3. Viết mã với lớp bên trong

Việc triển khai lớp bên trong hoặc lồng nhau không khó. Bạn có thể xem cấu trúc mã tại đây.

Bạn có thể truy cập lớp bên trong từ lớp bên ngoài bằng từ khóa self. Nhờ đó, bạn có thể nhanh chóng tạo một thể hiện của lớp bên trong và thao tác trong lớp bên ngoài theo ý muốn. Tuy nhiên, bạn không thể truy cập lớp bên ngoài từ một lớp bên trong. Hãy xem ví dụ dưới đây.

class Outer:
    """Outer Class"""

    def __init__(self):
        ## instantiating the 'Inner' class
        self.inner = self.Inner()

    def reveal(self):
        ## calling the 'Inner' class function display
        self.inner.inner_display("Calling Inner class function from Outer class")

    class Inner:
        """Inner Class"""

        def inner_display(self, msg):
            print(msg)

Giờ bạn sẽ tạo thể hiện của lớp Outer và gọi phương thức reveal() của nó để thực thi phương thức inner_display() của lớp Inner.

## creating an instance of the 'Outer' class
outer = Outer()
## calling the 'reveal()' method
outer.reveal()
Calling Inner class function from Outer class

Hãy xem một cách khác để truy cập lớp bên trong. Cách này kém hiệu quả hơn đôi chút.

Outer().Inner().inner_display("Calling the Inner class method directly")
Calling the Inner class method directly

Nếu bạn muốn tạo thể hiện của lớp bên trong ở ngoài lớp bên ngoài thì sao? Có làm được không? Có, hãy xem cách tạo thể hiện của lớp bên trong ở ngoài lớp bên ngoài.

outer = Outer()

## instantiating the inner class
inner = outer.Inner() ## inner = Outer().Inner() or inner = outer.inner
inner.inner_display("Just Print It!")
Just Print It!

3.1. Nhiều lớp bên trong

Đó là một lớp chứa nhiều hơn một lớp bên trong. Bạn có thể có nhiều lớp bên trong trong một lớp. Như đã nêu, việc triển khai nhiều lớp bên trong khá dễ dàng.

class Outer:
    """Outer Class"""

    def __init__(self):
        ## Instantiating the 'Inner' class
        self.inner = self.Inner()
        ## Instantiating the '_Inner' class
        self._inner = self._Inner()

    def show_classes(self):
        print("This is Outer class")
        print(inner)
        print(_inner)

    class Inner:
        """First Inner Class"""

        def inner_display(self, msg):
            print("This is Inner class")
            print(msg)

    class _Inner:
        """Second Inner Class"""

        def inner_display(self, msg):
            print("This is _Inner class")
            print(msg)

    ## ...

Cách truy cập các lớp giống như trước. Xem ví dụ để hiểu rõ hơn.

## instantiating the classes

## 'Outer' class
outer = Outer()
## 'Inner' class
inner = outer.Inner() ## inner = outer.inner or inner = Outer().Inner()
## '_Inner' class
_inner = outer._Inner() ## _inner = outer._outer or _inner = Outer()._Inner()

## calling the methods
outer.show_classes()

print()

## 'Inner' class
inner.inner_display("Just Print It!")

print()

## '_Inner' class
_inner.inner_display("Just Show It!")
This is Outer class
<__main__.Outer.Inner object at 0x0000021B37962048>
<__main__.Outer._Inner object at 0x0000021B37962160>

This is Inner class
Just Print It!

This is _Inner class
Just Show It!

3.2. Lớp bên trong đa cấp

Trong các lớp bên trong đa cấp, lớp bên trong chứa một lớp khác là bên trong của lớp trước đó. Bạn có thể xem cấu trúc phân cấp này tại đây:

class Outer:
    """Outer Class"""

    def __init__(self):
        ## instantiating the 'Inner' class
        self.inner = self.Inner()
        ## instantiating the multilevel 'InnerInner' class
        self.innerinner = self.inner.InnerInner()

    def show_classes(self):
        print("This is Outer class")
        print(inner)

    ## inner class
    class Inner:
        """First Inner Class"""

        def __init__(self):
            ## instantiating the 'InnerInner' class
            self.innerinner = self.InnerInner()

        def show_classes(self):
            print("This is Inner class")
            print(self.innerinner)

        ## multilevel inner class
        class InnerInner:

            def inner_display(self, msg):
                print("This is multilevel InnerInner class")
                print(msg)

        def inner_display(self, msg):
            print("This is Inner class")
            print(msg)

    ## ...

Hãy xem cách khởi tạo lớp bên trong đa cấp.

outer = Outer()

inner = outer.Inner()

## this is 'InnerInner' class instance
innerinner = inner.InnerInner() ## innerinner = Outer().Inner().InnerInner()

## let's call its method inner_display
innerinner.inner_display("Just Print It!")
This is multilevel InnerInner class
Just Print It!

Kết luận

Hy vọng giờ đây bạn đã hiểu khái niệm về các lớp bên trong. Đến lúc bạn tự thử nghiệm với các lớp lồng nhau. Chúc bạn viết mã vui vẻ :)

Nếu bạn muốn tìm hiểu thêm về lớp, hãy xem Hướng dẫn Lập trình Hướng đối tượng (OOP) trong Python của DataCamp.

hoặc học khóa Lập trình Hướng đối tượng trong Python của DataCamp.

Chủ đề

Liên quan