Phương thức trừu tượng Python là gì?

Các lớp cơ sở trừu tượng, được triển khai thông qua mô-đun abc của Python, cho phép bạn viết mã sạch hơn, an toàn hơn. Nhưng các lớp trừu tượng là gì và khi nào bạn cần chúng?

Tóm lại, các lớp cơ sở trừu tượng cho phép bạn triển khai các quy tắc xung quanh các lớp con. Điều này cho phép bạn định nghĩa các phương thức mà một lớp con phải có. Tương tự, nó cho phép bạn xác định các tham số mà một lớp con phải có

Đến cuối hướng dẫn này, bạn sẽ học được những điều sau

  • Cách tạo các lớp cơ sở trừu tượng trong Python bằng mô-đun abc
  • Cách thực thi các phương thức trong các lớp con bằng cách sử dụng các trình trang trí trừu tượng
  • Cách buộc và sử dụng các tham số khi sử dụng các phương thức trong các lớp con
  • Cách thực thi các thuộc tính khi phân lớp dữ liệu trong Python bằng mô-đun abc

Mục lục

Hiểu các lớp cơ sở trừu tượng với Python abc

Python triển khai các lớp trừu tượng thông qua thư viện abc. Nhưng, lớp trừu tượng thực sự là gì? . Các phương thức này được khai báo nhưng không được thực hiện. Trên thực tế, bạn không khởi tạo một lớp trừu tượng mà sử dụng một lớp con để cung cấp chi tiết cho việc triển khai thông qua các phương thức trừu tượng của nó

Tất cả những điều này có vẻ nhiều – và hơi trừu tượng. Đối với tôi, cách đơn giản nhất để hiểu điều này là nghĩ về các lớp trừu tượng như là một khuôn khổ mà một lớp con phải có

Hãy xem qua một ví dụ. Hãy tưởng tượng rằng chúng ta muốn định nghĩa một tập hợp các lớp cho nhân viên, cụ thể là cho người quản lý, người giám sát và nhân viên. Đối với những nhân viên này, tất cả nhân viên sẽ có thể đến nơi làm việc. Hãy xem cách chúng ta có thể định nghĩa cái này trông như thế nào

# Implementing Classes Without Abstract Base Classes
class Manager:
    def arrive_at_work[self]:
        print["Arrived at work"]

class Supervisor:
    def get_to_work[self]:
        print["Got to work"]

class Staff:
    def show_up[self]:
        print["Showed up"]

Tất cả các lớp này đều có các phương thức, về mặt chức năng, thực hiện cùng một việc – yêu cầu nhân viên bắt đầu làm việc. Tuy nhiên, nếu chúng ta muốn thực sự có đối tượng nhân viên xuất hiện tại nơi làm việc, chúng ta cần sử dụng ba triển khai khác nhau cho cùng một thứ

Đây là nơi các lớp cơ sở trừu tượng phát huy tác dụng. Chúng ta có thể thực thi những phương thức nào được yêu cầu khi phân lớp bằng cách sử dụng mô-đun abc Python. Ví dụ: nếu chúng tôi biết rằng mỗi nhân viên cần phải đi làm, chúng tôi có thể xác định một phương thức trừu tượng để thực hiện việc này

Bây giờ chúng ta đã phát triển một trường hợp tốt để sử dụng các lớp trừu tượng trong Python, hãy đi sâu vào cách thực hiện việc này bằng mô-đun abc của Python

Cách sử dụng phương pháp trừu tượng với Python abc

Để tạo các lớp trừu tượng trong Python, chúng ta có thể sử dụng mô-đun abc tích hợp sẵn. Mô-đun cung cấp cả lớp ABC và trình trang trí abstractmethod. Hãy đi sâu vào cách tạo một lớp cơ sở trừu tượng

# Implementing an Abstract Base Class
from abc import ABC, abstractmethod

class Employee[ABC]:
    @abstractmethod
    def arrive_at_work[self]:
        pass

Chúng ta có thể thấy rằng bây giờ chúng ta có một lớp

# Implementing an Abstract Base Class
from abc import ABC, abstractmethod

class Employee[ABC]:
    @abstractmethod
    def arrive_at_work[self]:
        pass
0, kế thừa từ chính lớp ABC. Lớp chỉ có một phương thức duy nhất, được trang trí bằng cách sử dụng trình trang trí
# Implementing an Abstract Base Class
from abc import ABC, abstractmethod

class Employee[ABC]:
    @abstractmethod
    def arrive_at_work[self]:
        pass
2. Bản thân phương thức này không làm gì ngoài việc chấp nhận từ khóa
# Implementing an Abstract Base Class
from abc import ABC, abstractmethod

class Employee[ABC]:
    @abstractmethod
    def arrive_at_work[self]:
        pass
3 làm đối số. Phần này quan trọng. phương pháp không nên làm bất cứ điều gì ngoại trừ tồn tại

Bây giờ khi chúng ta tạo các lớp con của lớp

# Implementing an Abstract Base Class
from abc import ABC, abstractmethod

class Employee[ABC]:
    @abstractmethod
    def arrive_at_work[self]:
        pass
0, các lớp này sẽ cần phải có một phương thức tên là
# Implementing an Abstract Base Class
from abc import ABC, abstractmethod

class Employee[ABC]:
    @abstractmethod
    def arrive_at_work[self]:
        pass
5. Hãy xem điều gì sẽ xảy ra khi chúng ta tạo một lớp con với một phương thức khác

# Implementing an Abstract Base Class Without Correct Method
from abc import ABC, abstractmethod

class Employee[ABC]:
    @abstractmethod
    def arrive_at_work[self]:
        pass

class Manager[Employee]:
    def show_up[self]:
        print["I'm here!"]

nik = Manager[]

# Returns: 
# TypeError: Can't instantiate abstract class Manager with abstract method arrive_at_work

Khởi tạo lớp

# Implementing an Abstract Base Class
from abc import ABC, abstractmethod

class Employee[ABC]:
    @abstractmethod
    def arrive_at_work[self]:
        pass
6 của chúng tôi sẽ tăng một
# Implementing an Abstract Base Class
from abc import ABC, abstractmethod

class Employee[ABC]:
    @abstractmethod
    def arrive_at_work[self]:
        pass
7 vì chúng tôi không có phương thức
# Implementing an Abstract Base Class
from abc import ABC, abstractmethod

class Employee[ABC]:
    @abstractmethod
    def arrive_at_work[self]:
        pass
5. Hãy xem cách chúng tôi có thể giải quyết vấn đề này

# Implementing an Abstract Base Class Correctly
from abc import ABC, abstractmethod
class Employee[ABC]:
    @abstractmethod
    def arrive_at_work[self]:
        pass

class Manager[Employee]:
    def arrive_at_work[self]:
        print["Arriving at datagy.io headquarters!"]

nik = Manager[]

Khi chúng tôi chạy mã ở trên, không có lỗi nào được nêu ra. Điều này là do chúng ta có phương thức được đặt tên chính xác

Hãy nhớ từ phần trước trong hướng dẫn rằng việc triển khai phương thức trừu tượng tùy thuộc vào chính lớp con. Do đó, chúng ta có thể có các triển khai khác nhau của các phương thức này để thực hiện các tác vụ khác nhau - miễn là chúng có tên chính xác. Hãy xem nó trông như thế nào

# Implementing Different Methods for Classes
from abc import ABC, abstractmethod

class Employee[ABC]:
    @abstractmethod
    def arrive_at_work[self]:
        pass

class Manager[Employee]:
    def arrive_at_work[self]:
        print["Arriving at datagy.io headquarters!"]

class Supervisor[Employee]:
    def arrive_at_work[self]:
        print["Reporting for duty at datagy.io!"]

nik = Manager[]
katie = Supervisor[]

Chúng ta có thể thấy trong ví dụ trên, mã chạy tốt. Điều này là do cả hai lớp con đều có tên chính xác - ngay cả khi cách triển khai của chúng khác nhau

Trong phần sau, bạn sẽ tìm hiểu cách thêm tham số vào một abstractmethod và cách thực thi rằng chúng tồn tại trong bất kỳ lớp con nào

Cách thêm tham số vào phương thức trừu tượng trong Python abc

Điều tuyệt vời về trình trang trí abstractmethod là chúng ta thậm chí có thể yêu cầu một phương thức có một hoặc nhiều tham số. Điều này cho phép bạn đảm bảo rằng bất kỳ phương thức nào tồn tại trong lớp con đều có các tham số bắt buộc

Ví dụ: nếu bạn cần phương thức

# Implementing an Abstract Base Class
from abc import ABC, abstractmethod

class Employee[ABC]:
    @abstractmethod
    def arrive_at_work[self]:
        pass
5 để chuyển thời gian vào, thì bạn có thể thực hiện việc này bằng cách sử dụng trình trang trí abstractmethod. Hãy xem nó trông như thế nào

# Adding Parameters to Methods in Abstract Base Classes
from abc import ABC, abstractmethod
class Employee[ABC]:
    @abstractmethod
    def arrive_at_work[self, arrival_time]:
        pass

class Manager[Employee]:
    def arrive_at_work[self, arrival_time]:
        print[f"Arriving at datagy.io headquarters at {arrival_time}!"]

class Supervisor[Employee]:
    def arrive_at_work[self, arrival_time, location]:
        print[
            f"Reporting at datagy.io at {arrival_time} at the {location} office!"]

nik = Manager[]
nik.arrive_at_work[8]
katie = Supervisor[]
katie.arrive_at_work[9, 'Toronto']

# Returns:
# Arriving at datagy.io headquarters at 8!
# Reporting at datagy.io at 9 at the Toronto office!

Trong đoạn mã trên, chúng ta sử dụng lớp ABC để tạo một lớp cơ sở trừu tượng. Phương thức trong lớp có một tham số bổ sung,

# Implementing an Abstract Base Class Without Correct Method
from abc import ABC, abstractmethod

class Employee[ABC]:
    @abstractmethod
    def arrive_at_work[self]:
        pass

class Manager[Employee]:
    def show_up[self]:
        print["I'm here!"]

nik = Manager[]

# Returns: 
# TypeError: Can't instantiate abstract class Manager with abstract method arrive_at_work
3. Cả hai lớp con đều có tham số này và bắt buộc phải có tham số

Điều thú vị là lớp con

# Implementing an Abstract Base Class Without Correct Method
from abc import ABC, abstractmethod

class Employee[ABC]:
    @abstractmethod
    def arrive_at_work[self]:
        pass

class Manager[Employee]:
    def show_up[self]:
        print["I'm here!"]

nik = Manager[]

# Returns: 
# TypeError: Can't instantiate abstract class Manager with abstract method arrive_at_work
4 thực sự có một tham số bổ sung. Lớp con chỉ yêu cầu các tham số được định nghĩa trong chính lớp trừu tượng, nhưng cũng có thể có các tham số bổ sung

Cách thêm thuộc tính vào các lớp cơ sở trừu tượng trong Python

Trong phần này, bạn sẽ học cách thêm các thuộc tính vào các lớp cơ sở trừu tượng. Điều này cho phép bạn đảm bảo rằng các thuộc tính nhất định được thiết lập khi tạo một lớp cơ sở trừu tượng. Quá trình này liên quan nhiều hơn một chút, vì vậy hãy xem một ví dụ

# Adding Properties to Abstract Base Classes
from abc import ABC, abstractmethod
class Employee[ABC]:
    @abstractmethod
    def __init__[self, name]:
        self._name = name

    @property
    @abstractmethod
    def name[self]:
        pass

    @name.setter
    @abstractmethod
    def name[self, value]:
        pass

class Manager[Employee]:
    def __init__[self, name]:
        self._name = name

    @property
    def name[self]:
        return self._name

    @name.setter
    def name[self, value]:
        self._name = value

nik = Manager['Nik']
print[nik.name]

# Returns: Nik

Trong ví dụ trên, chúng tôi sử dụng trình trang trí

# Implementing an Abstract Base Class Without Correct Method
from abc import ABC, abstractmethod

class Employee[ABC]:
    @abstractmethod
    def arrive_at_work[self]:
        pass

class Manager[Employee]:
    def show_up[self]:
        print["I'm here!"]

nik = Manager[]

# Returns: 
# TypeError: Can't instantiate abstract class Manager with abstract method arrive_at_work
5 để đảm bảo rằng các mục được gắn nhãn là thuộc tính. Chúng tôi cũng cần cung cấp các phương thức setter để đảm bảo rằng chúng hoạt động. Lưu ý rằng chúng tôi triển khai thuộc tính trước khi xác định setter

Sau đó, trong lớp con, chúng tôi thực hiện theo một phương pháp tương tự để xác định các mục này. Miễn là các thuộc tính và phương thức của chúng ta có tên chính xác, lớp con sẽ kế thừa một cách thích hợp

Phần kết luận

Trong hướng dẫn này, bạn đã học cách sử dụng mô-đun abc Python để tạo các lớp cơ sở trừu tượng, đóng vai trò là bản thiết kế cho các lớp con bổ sung. Lần đầu tiên bạn tìm hiểu lý do tại sao khái niệm lớp trừu tượng lại quan trọng. Sau đó, bạn đã học cách sử dụng lớp ABC từ mô-đun abc để tạo khung lớp trừu tượng

Từ đó, bạn đã học cách định nghĩa các phương thức trừu tượng bằng cách sử dụng trình trang trí phương thức trừu tượng. Bạn cũng đã học cách yêu cầu các tham số nhất định cho các phương thức của lớp con. Cuối cùng, bạn cũng đã học cách đặt thuộc tính cho bất kỳ lớp con nào của lớp cơ sở trừu tượng

Việc sử dụng phương pháp trừu tượng là gì?

Trong bất kỳ ngôn ngữ lập trình nào, tính trừu tượng có nghĩa là ẩn người dùng khỏi những chi tiết không liên quan để chỉ tập trung vào những chi tiết thiết yếu nhằm tăng hiệu quả, từ đó giảm độ phức tạp . Trong Java, sự trừu tượng đạt được bằng cách sử dụng các lớp và phương thức trừu tượng.

Tại sao nên sử dụng các phương thức trừu tượng trong Python?

Trong Python, các lớp cơ sở trừu tượng cung cấp bản thiết kế cho các lớp cụ thể . Chúng không chứa triển khai. Thay vào đó, chúng cung cấp một giao diện và đảm bảo rằng các lớp cụ thể dẫn xuất được triển khai đúng cách.

Thuộc tính trừu tượng Python là gì?

Các lớp trừu tượng đảm bảo rằng các lớp dẫn xuất triển khai các phương thức và thuộc tính được định nghĩa trong lớp cơ sở trừu tượng. Lớp cơ sở trừu tượng không thể được khởi tạo. Chúng tôi sử dụng @abstractmethod để định nghĩa một phương thức trong lớp cơ sở trừu tượng và kết hợp @property và @abstractmethod để định nghĩa một thuộc tính trừu tượng

Phương pháp trừu tượng là gì?

Các phương thức trừu tượng là những loại phương thức không yêu cầu triển khai khai báo . Các phương thức này không có phần thân có nghĩa là không thực hiện. Một vài thuộc tính của một phương thức trừu tượng là. Một phương thức trừu tượng trong Java được khai báo thông qua từ khóa “abstract”.

Chủ Đề