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?
-
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ã.
-
Ẩ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.
-
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.
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.