Kế thừa lớp trừu tượng Python

Các bạn đọc like ủng hộ MUO nhé. Khi bạn mua hàng bằng các liên kết trên trang web của chúng tôi, chúng tôi có thể kiếm được hoa hồng liên kết. Đọc thêm

Một lớp trừu tượng là một kế hoạch chi tiết cho các lớp liên quan. Nó không thể được khởi tạo mà chỉ có thể được truy cập thông qua kế thừa. Một lớp con kế thừa một lớp trừu tượng được yêu cầu thực hiện các phương thức trừu tượng của nó. Nếu không, trình biên dịch sẽ báo lỗi

Các phương thức trừu tượng là các phương thức không có triển khai. Một lớp trừu tượng có thể có các phương thức trừu tượng hoặc phương thức cụ thể [bình thường]

Python không hỗ trợ trực tiếp các phương thức trừu tượng, nhưng bạn có thể truy cập chúng thông qua mô-đun abc [lớp cơ sở trừu tượng]

Sử dụng Mô-đun abc trong Python

Để định nghĩa một lớp trừu tượng trong Python, bạn cần nhập mô-đun abc

Xem ví dụ bên dưới

 from abc import ABC

class AbstractClassName[ABC]:
   pass

Chú ý từ khóa pass. Từ khóa này được sử dụng để thay thế cho mã trống. Bỏ nó ra sẽ báo lỗi biên dịch

Có liên quan. Julia sẽ đấu thầu ngai vàng của Python chứ?

Định nghĩa lớp, định nghĩa phương thức, vòng lặp và câu lệnh if mong đợi triển khai mã. Vì vậy, bỏ chúng ra sẽ gây ra lỗi biên dịch. Để tránh điều này, hãy sử dụng pass để thay thế mã trống

Để xác định một phương thức trừu tượng trong Python, hãy sử dụng trình trang trí @abstractmethod

 from abc import ABC, abstractmethod

class AbstractClassName[ABC]:

   @abstractmethod
   def abstractMethod[self]:
       pass

Tại thời điểm này, sẽ tốt hơn nếu đề cập rằng—không giống như Java—các phương thức trừu tượng trong Python có thể có triển khai. Việc triển khai này có thể được truy cập trong phương thức ghi đè bằng phương thức super[]

 import abc

class AbstractClass[ABC]:
     def __init__[self, value]:
       self.value = value
       super[].__init__[]

   @abc.abstractmethod
   def some_action[self]:
       print["This is the parent implementation."]

class MySubclass[AbstractClassExample]:
   def some_action[self]:
       super[].some_action[]
       print["This is the subclass implementation. "]

x = MySubclass[]
x.some_action[]

Thật thú vị khi lưu ý rằng bạn có thể định nghĩa hàm tạo trong lớp trừu tượng

Trên dòng 9, bạn có thể thấy rằng @abc. abstractmethod đã được sử dụng làm trình trang trí phương thức trừu tượng. Đây là một cách khác để làm như vậy khác với hình thức trước đó. Cũng lưu ý rằng dòng 1 ngắn hơn [nhập abc] so với dòng 1 nhập trước đây mà bạn đã sử dụng

Đó là tất cả một vấn đề của sự lựa chọn. Mặc dù vậy, nhiều người có thể thấy phương pháp thứ hai ngắn hơn

Xử lý ngoại lệ trong Python

Lưu ý rằng không có cách nào để nắm bắt lỗi trong ví dụ mã ở trên. Lỗi xảy ra thường xuyên hơn không và có một cách đáng tin cậy để xử lý chúng có thể là yếu tố thay đổi cuộc chơi

Những sự kiện làm gián đoạn dòng chương trình bình thường được gọi là "ngoại lệ" và việc quản lý chúng được gọi là "xử lý ngoại lệ. " Tiếp theo trong danh sách đọc Python của bạn là xử lý ngoại lệ

Trừu tượng hóa là khái niệm trong lập trình hướng đối tượng được sử dụng để che giấu chức năng bên trong của các lớp khỏi người dùng. Trừu tượng hóa được thực hiện bằng cách sử dụng các lớp trừu tượng. Một lớp trừu tượng trong Python thường được tạo để khai báo một tập hợp các phương thức phải được tạo trong bất kỳ lớp con nào được xây dựng trên lớp trừu tượng này. Tương tự, một phương thức trừu tượng là một phương thức không có bất kỳ triển khai nào

Giới thiệu về các lớp trừu tượng Python

Tóm lại, người dùng đã quen thuộc với mục đích của các phương thức của lớp, nhưng họ không biết cách họ giải quyết mục đích đó, nghĩa là họ biết đầu vào và đầu ra mong đợi, nhưng hoạt động bên trong bị ẩn.

Có rất nhiều ví dụ thực tế, chẳng hạn như khi chúng ta nhấn một nút trên điều khiển TV để thay đổi kênh; . Chúng tôi chỉ quan tâm đến thực tế là khi chúng tôi nhấn một nút cụ thể, nó sẽ thay đổi kênh

Điện thoại thông minh là một ví dụ khác về sự trừu tượng; . Chúng tôi chỉ quan tâm đến những gì chúng tôi cần làm để thực hiện một nhiệm vụ

Ví dụ: chúng tôi không biết cách điện thoại quay video bằng cách nhấn nút ghi, chúng tôi chỉ cần chạm/nhấn một nút và nó sẽ thực hiện điều đó. Có rất nhiều ví dụ khác về sự trừu tượng để chúng ta quan sát trong thế giới thực

Chúng ta có thể suy luận từ các ví dụ trên rằng tính trừu tượng giúp chúng ta làm cho mọi thứ trở nên thân thiện hơn và ít phức tạp hơn. Trong bối cảnh lập trình, Trừu tượng được sử dụng để làm cho cuộc sống của các nhà phát triển khác trở nên dễ dàng. Ví dụ, trong Python chúng ta không biết hàm sort[] của lớp list hoạt động như thế nào, chúng ta chỉ sử dụng hàm này và nó sẽ sắp xếp danh sách cho chúng ta

Mặc dù Python không phải là ngôn ngữ lập trình hướng đối tượng hoàn toàn, vì chúng ta có thể viết mã bằng Python mà không cần tạo bất kỳ lớp nào, nhưng nó hỗ trợ tất cả các tính năng của lập trình hướng đối tượng bao gồm lớp trừu tượng và lớp trừu tượng.

Chúng ta không thể tạo trực tiếp một lớp trừu tượng trong Python. Tuy nhiên, Python có cung cấp một mô-đun cho phép chúng ta định nghĩa các lớp trừu tượng. Mô-đun chúng ta có thể sử dụng để tạo một lớp trừu tượng trong Python là mô-đun abc[abstract base class]

Các phương thức trừu tượng buộc các lớp con cung cấp việc triển khai các phương thức này trong chúng và do đó giúp chúng ta đạt được sự trừu tượng hóa vì mỗi lớp con có thể đưa ra cách triển khai của riêng nó. Một lớp chứa một hoặc nhiều phương thức trừu tượng được gọi là lớp trừu tượng

Chúng ta có thể sử dụng cú pháp sau để tạo một lớp trừu tượng trong Python

from abc import ABC
class [ABC]:
	# body of the class

Ở đây chúng ta chỉ cần kế thừa lớp ABC từ mô-đun abc trong Python

Bây giờ, hãy lấy ví dụ sau để chứng minh các lớp trừu tượng

from abc import ABC
class DemoAbstractClass[ABC]:
	pass

Để định nghĩa một phương thức trừu tượng, chúng ta sử dụng trình trang trí @abstractmethod của mô-đun abc. Nó nói với Python rằng phương thức được khai báo là trừu tượng và nên được ghi đè trong các lớp con

Chúng ta có thể sử dụng cú pháp sau để tạo một phương thức trừu tượng trong Python

from abc import ABC, abstractmethod
class [ABC]:
    @abstractmethod
    def [self,other_parameters]:
        pass

Chúng ta chỉ cần đặt trình trang trí này trên bất kỳ chức năng nào mà chúng ta muốn tạo trừu tượng và mô-đun abc sẽ lo phần còn lại

Bây giờ, hãy lấy ví dụ sau để chứng minh các lớp trừu tượng

from abc import ABC, abstractmethod
class DemoAbstractClass[ABC]:
    @abstractmethod
    def abstract_method_name[self]:
        pass

Chúng ta sẽ thấy cách sử dụng chi tiết của mô-đun này trong các phần tiếp theo của bài viết này

:::

Ví dụ lớp trừu tượng Python

Bây giờ, chúng ta đã thấy cách tạo một lớp trừu tượng trong Python. Hãy lấy một ví dụ rất phổ biến để minh họa việc sử dụng các lớp và phương thức trừu tượng

Giả sử chúng ta muốn vẽ các hình dạng khác nhau. Để làm điều này, chúng tôi tạo một lớp trừu tượng cơ bản Hình dạng chứa bản thiết kế cho các hình dạng cụ thể để theo dõi. Lớp này sẽ cung cấp các phương thức cần thiết để các lớp con của nó triển khai cho các hình dạng cụ thể

Trước tiên hãy tạo lớp Shape

from abc import ABC, abstractmethod
 
class Shape[ABC]:
    def __init__[self, shape_name]:
        self.shape_name = shape_name
    
    @abstractmethod
    def draw[self]:
        pass

Như bạn có thể nói rằng chúng ta đã khai báo một phương thức không xác định là draw[]. Phương thức này sẽ được thực hiện bởi các lớp khác kế thừa lớp này

Ví dụ: Nếu chúng ta muốn vẽ một hình tròn. Chúng ta tạo một lớp Circle sẽ kế thừa lớp Shape và triển khai phương thức draw[]. Hãy xem việc triển khai lớp Circle

________số 8

Bây giờ chúng ta có thể tạo một đối tượng của lớp này trong ứng dụng chính của chúng ta. py và gọi phương thức draw[] của nó

from Circle import Circle
 
#create a circle object
circle = Circle[]
circle.draw[]

Đầu ra của đoạn mã trên là

Bây giờ, giả sử chúng ta muốn vẽ một hình khác, giả sử là Hình tam giác. Chúng ta tạo một lớp Triangle tương tự như lớp Circle, lớp này sẽ kế thừa lớp Shape và triển khai phương thức draw[]. Hãy xem việc triển khai lớp Triangle

 from abc import ABC, abstractmethod

class AbstractClassName[ABC]:

   @abstractmethod
   def abstractMethod[self]:
       pass
0

Bây giờ, hãy tạo một đối tượng có cả hai hình dạng trong ứng dụng chính của chúng ta. py và gọi các phương thức draw[] của chúng

 from abc import ABC, abstractmethod

class AbstractClassName[ABC]:

   @abstractmethod
   def abstractMethod[self]:
       pass
1

Đầu ra của đoạn mã trên như mong đợi là

 from abc import ABC, abstractmethod

class AbstractClassName[ABC]:

   @abstractmethod
   def abstractMethod[self]:
       pass
2

Tương tự, chúng ta có thể tạo bao nhiêu lớp hình dạng cụ thể tùy thích, với lớp Hình dạng là lớp trừu tượng chính

Chúng ta sẽ xem điều này giúp chúng ta như thế nào trong các phần tiếp theo

Tại sao sử dụng các lớp cơ sở trừu tượng?

Như chúng ta đã thảo luận ở trên, các lớp trừu tượng được sử dụng để tạo một kế hoạch chi tiết cho các lớp của chúng ta vì chúng không chứa triển khai phương thức. Đây là một khả năng rất hữu ích, đặc biệt là trong các tình huống mà các lớp con nên cung cấp cách triển khai riêng của chúng. Ngoài ra, trong các dự án phức tạp liên quan đến các nhóm lớn và cơ sở mã khổng lồ, việc nhớ tất cả các tên lớp là khá khó khăn.

Tầm quan trọng của các lớp trừu tượng

Như chúng ta đã thảo luận trong phần trên, chúng ta định nghĩa một kế hoạch chi tiết cho các lớp của mình bằng cách sử dụng một lớp trừu tượng. Tầm quan trọng của việc sử dụng các lớp trừu tượng trong Python là nếu các lớp con của chúng ta không tuân theo kế hoạch chi tiết đó, Python sẽ báo lỗi. Vì vậy, chúng tôi có thể đảm bảo rằng các lớp của chúng tôi tuân theo cấu trúc và triển khai tất cả các phương thức trừu tượng được định nghĩa trong lớp trừu tượng của chúng tôi

Hãy lấy một ví dụ để hiểu điều này. Giả sử trong ví dụ về lớp Circle, chúng ta không định nghĩa phương thức draw[];

Hãy xem điều gì sẽ xảy ra nếu chúng ta làm điều đó và chạy ứng dụng chính của mình. chương trình py

from abc import ABC
class DemoAbstractClass[ABC]:
	pass
0

Đầu ra của đoạn mã trên là

from abc import ABC
class DemoAbstractClass[ABC]:
	pass
1

Vì vậy, bằng cách sử dụng các lớp trừu tượng, chúng ta có thể đảm bảo rằng các lớp con của chúng ta sử dụng cùng cấu trúc và cùng tên phương thức cho các tác vụ tương tự

Ngoài ra, bằng cách sử dụng các lớp trừu tượng, chúng tôi có thể ẩn các chi tiết không cần thiết khỏi người dùng và giảm độ phức tạp của chương trình xuống mức độ lớn

Thuộc tính trừu tượng

Lớp trừu tượng trong Python cũng cung cấp chức năng của các thuộc tính trừu tượng bên cạnh các phương thức trừu tượng. Thuộc tính là cách Pythonic sử dụng getters và setters. Mô-đun abc có trình trang trí @abstractproperty để sử dụng các thuộc tính trừu tượng. Cũng giống như các phương thức trừu tượng, chúng ta cần định nghĩa các thuộc tính trừu tượng trong các lớp triển khai. Nếu không, Python sẽ báo lỗi

Như chúng ta đã biết, các thuộc tính được sử dụng trong Python cho getters và setters. Thuộc tính trừu tượng được cung cấp bởi mô-đun abc để buộc lớp con cung cấp getters và setters cho một biến trong Python

Hãy định nghĩa một thuộc tính trừu tượng trong lớp Shape của chúng ta

from abc import ABC
class DemoAbstractClass[ABC]:
	pass
2

Bây giờ, hãy thử tạo đối tượng của lớp Circle

Nếu chúng tôi chạy đoạn mã này, chúng tôi sẽ gặp lỗi sau

from abc import ABC
class DemoAbstractClass[ABC]:
	pass
3

Lý do chúng tôi gặp lỗi này là chúng tôi không có bất kỳ thuộc tính nào có tên name trong lớp cụ thể Circle. Hãy khắc phục điều này bằng cách định nghĩa thuộc tính name trong lớp Circle

from abc import ABC
class DemoAbstractClass[ABC]:
	pass
4

Bây giờ, hãy thử tạo lại đối tượng của lớp Circle và truy cập thuộc tính name

from abc import ABC
class DemoAbstractClass[ABC]:
	pass
5

Lần này, chúng ta sẽ nhận được đầu ra sau

Khởi tạo lớp trừu tượng

Các lớp trừu tượng không hoàn chỉnh, vì chúng có thể có một số phương thức không được định nghĩa. Vì vậy, chúng tôi không thể tạo một thể hiện hoặc đối tượng của một lớp trừu tượng trong Python. Nếu chúng ta cố gắng khởi tạo lớp trừu tượng, nó sẽ phát sinh lỗi

Hãy xác minh điều này bằng cách thử khởi tạo lớp Shape trong ứng dụng của chúng ta. tập tin py

from abc import ABC
class DemoAbstractClass[ABC]:
	pass
6

Bây giờ khi chúng tôi chạy mã này, chúng tôi sẽ gặp lỗi sau

from abc import ABC
class DemoAbstractClass[ABC]:
	pass
7

Gọi các phương thức từ các lớp trừu tượng

Không giống như một số ngôn ngữ lập trình khác, các phương thức Python trừu tượng không cần phải hoàn toàn trừu tượng; . Lớp cụ thể là lớp có định nghĩa cho tất cả các phương thức của nó và không có phương thức trừu tượng

Các lớp cụ thể có thể sử dụng super[] để gọi phương thức trừu tượng cơ sở và thực hiện một số tác vụ bổ sung cho nó. Trong ví dụ của chúng ta, phương thức trừu tượng draw[] của lớp Shape có thể được sử dụng để chuẩn bị một canvas cơ bản, sau đó các lớp cụ thể có thể hoạt động trên đó để vẽ các hình cụ thể. Hãy xem điều này trong mã

from abc import ABC
class DemoAbstractClass[ABC]:
	pass
8

Như bạn có thể thấy, thay vì khai báo một phương thức rỗng, chúng ta đã định nghĩa việc triển khai cấp cao trong phương thức draw[]

Bây giờ hãy xem lớp Circle

from abc import ABC
class DemoAbstractClass[ABC]:
	pass
9

Ở đây, trước tiên chúng ta đã gọi phương thức draw[] của lớp Shape thông qua super[]. draw[] và sau đó cung cấp yêu cầu triển khai bổ sung

Hãy thử gọi lại phương thức draw[] của lớp Circle

from abc import ABC, abstractmethod
class [ABC]:
    @abstractmethod
    def [self,other_parameters]:
        pass
0

Lần này, chúng ta sẽ nhận được đầu ra sau

from abc import ABC, abstractmethod
class [ABC]:
    @abstractmethod
    def [self,other_parameters]:
        pass
1

Theo cách này, chúng ta có thể cung cấp một triển khai cấp cao chung cho tất cả các lớp con của lớp cơ sở trừu tượng và các lớp con đó có thể cung cấp triển khai của riêng chúng

Các lớp cơ sở trừu tượng hoạt động như thế nào?

Chúng ta đã thấy các lớp trừu tượng được kế thừa bởi các lớp con cụ thể như thế nào. Chúng định nghĩa các phương thức chung bằng cách sử dụng trình trang trí @abstractmethod và các thuộc tính bằng cách sử dụng @abstractproperty để buộc các lớp con triển khai các phương thức và thuộc tính đó. Do đó, việc triển khai được xử lý bởi các lớp con cụ thể, nơi chúng ta có thể tạo các đối tượng để thực hiện các tác vụ

Thực hiện thông qua Subclassing

Trong suốt bài viết này, chúng tôi đã triển khai các lớp cơ sở trừu tượng thông qua việc sử dụng phân lớp. Đầu tiên chúng ta kế thừa lớp ABC trong lớp trừu tượng [Shape], sau đó chúng ta kế thừa lớp trừu tượng này trong lớp cụ thể hoặc lớp con [Circle]. Đây là cách được đề xuất và tốt nhất để triển khai các lớp trừu tượng

Ngoài ra còn có cách thứ hai để triển khai các lớp trừu tượng bằng cách đăng ký các lớp theo cách thủ công với tư cách là cha mẹ và con cái. Nhưng quy trình đăng ký lớp thủ công này phức tạp hơn cũng như kém trực quan hơn và do đó, hầu hết các nhà phát triển triển khai các lớp trừu tượng thông qua phân lớp.

Các phương thức cụ thể trong các lớp cơ sở trừu tượng

Các lớp trừu tượng cũng có thể chứa các phương thức cụ thể có triển khai phương thức đó và có thể được sử dụng bởi tất cả các lớp cụ thể. Để định nghĩa một phương thức cụ thể trong một lớp trừu tượng, chúng ta chỉ cần định nghĩa một phương thức có triển khai và không trang trí nó bằng trình trang trí @abstractmethod. Nếu cần, chúng tôi cũng có thể ghi đè phương thức cụ thể này trong lớp cụ thể để cung cấp bất kỳ chức năng bổ sung nào theo nhu cầu của người dùng

Hãy cùng xem đoạn mã sau để tạo một phương thức cụ thể trong lớp trừu tượng [Shape]

from abc import ABC, abstractmethod
class [ABC]:
    @abstractmethod
    def [self,other_parameters]:
        pass
2

Trong đoạn mã trên, chúng ta đã định nghĩa một phương thức cụ thể trong lớp Shape được gọi là print_greetings[] sẽ chỉ in một thông báo đơn giản. Bây giờ chúng ta có thể gọi phương thức này bằng cách sử dụng đối tượng của lớp cụ thể của chúng ta [Vòng tròn]

Lớp trừu tượng có thể được kế thừa trong Python không?

Chúng ta đã thấy cách các lớp trừu tượng được kế thừa bởi các lớp con cụ thể . Chúng định nghĩa các phương thức chung bằng cách sử dụng trình trang trí @abstractmethod và các thuộc tính bằng cách sử dụng @abstractproperty để buộc các lớp con triển khai các phương thức và thuộc tính đó.

Lớp trừu tượng có thể có tính kế thừa không?

Một lớp trừu tượng không thể được kế thừa bởi các cấu trúc . Nó có thể chứa hàm tạo hoặc hàm hủy. Nó có thể thực hiện các chức năng với các phương thức không trừu tượng. Nó không thể hỗ trợ nhiều kế thừa.

Lớp nào nên kế thừa từ trừu tượng trong Python?

Tất cả các phương thức và thuộc tính trừu tượng cần được triển khai trong một lớp con để có thể tạo các đối tượng từ nó. Chúng ta có thể tạo một lớp trừu tượng bằng cách kế thừa từ lớp ABC là một phần của mô-đun abc.

Sự khác biệt giữa lớp trừu tượng và kế thừa trong Python là gì?

Trừu tượng ẩn các chi tiết triển khai và chỉ hiển thị chức năng. Nó làm giảm độ phức tạp của mã. Kế thừa tạo một lớp bằng cách sử dụng các thuộc tính của một lớp khác. Nó cải thiện khả năng sử dụng lại mã

Chủ Đề