Hướng dẫn abstraction in python

Giới thiệu

Abstraction là một trong bốn trụ cột của Lập trình hướng đối tượng, ba trụ cột còn lại Encapsulation, Inheritance, Polymorphism. Abstraction cho phép người ta tập trung vào các khía cạnh thiết yếu của một đối tượng trong khi bỏ qua các chi tiết không cần thiết. Một trong những tính năng quan trọng nhất của Lập trình hướng đối tượng là nó mô hình hóa các tình huống trong cuộc sống thực. Một chương trình hướng đối tượng hoạt động chính xác theo cách mọi thứ diễn ra trong thế giới thực, Điều này có thể được chứng minh rất hiệu quả bằng cách sử dụng khái niệm Abstraction.

Ví dụ với mã

Hãy xem xét rằng có một lớp được gọi là Hình dạng. Hình dạng là một thực thể trừu tượng. Chúng ta không thể hình dung một hình dạng một cách độc lập. Một hình dạng có thể có các dạng khác nhau như Hình tròn, Hình chữ nhật, Hình tam giác, Đa giác, v.v. Vì vậy, không thể thực hiện bất kỳ phép toán xác định nào trên một hình dạng như tìm diện tích hoặc chu vi mà không biết nó biểu diễn dạng nào.

Chúng ta có thể sử dụng ABC metaclass và @abstractmethod trang trí từ abc mô-đun để tạo một Abstract Base Class gọi là Shape như sau:

#!/usr/bin/python
# -*- coding: utf-8 -*-
class Shape(ABC):
    def __init__(self):
        print 'I am a Shape'
    @abstractmethod
    def area(self):
        pass
    @abstractmethod
    def circumference(self):
        pass

Lưu ý rằng area() và circumference() các phương thức là các phương thức trừu tượng. Do đó, họ không có triển khai trong Shape lớp.

Bây giờ nếu chúng ta cố gắng tạo một phiên bản của Shape lớp học, python sẽ ném TypeError ngoại lệ như sau:

s = Shape()

TypeError: Can’t instantiate abstract class Shape with abstract methods area, circumference

Điều này làm rõ rằng chúng ta không thể tạo một thể hiện của một lớp trừu tượng. Nhưng chúng ta cần lấy các lớp từ một Lớp cơ sở trừu tượng và cung cấp triển khai cho các phương thức trừu tượng.

Trong trường hợp của chúng tôi, chẳng hạn, chúng tôi có thể dẫn xuất các lớp Circle Rectangle từ Shape lớp và thực hiện area() và circumference() các phương thức như sau:

class Circle(Shape):
       def __init__(self):
            super().__init__()
            print("I am a Circle")
       def area(self):
            radius = int(input("Enter the radius: "))
            print("Area of the Circle is %.2f." % ((22.0 / 7.0) * radius * radius))
       def circumference(self):
            radius = int(input("Enter the radius: "))
            print("Circumference of the Circle is %.2f." % (2 * (22.0 / 7.0) * radius))
class Rectangle(Shape):
       def __init__(self):
            super().__init__()
            print("I am a Rectangle")
       def area(self):
            length = int(input("Enter the length: "))
            breadth = int(input("Enter the breadth: "))
            print("Area of the Rectangle is %d." % (length * breadth))
       def circumference(self):
            length = int(input("Enter the length: "))
            breadth = int(input("Enter the breadth: "))
            print("Circumference of the Rectangle is %d." % (2 * (length + breadth)))

Bây giờ chúng ta có thể khởi tạo Circle Rectangle các lớp học và gọi area() và circumference() các phương thức.

Sau đây là mã python đầy đủ,

# Demonstration of Abstraction
from abc import ABC, abstractmethod
class Shape(ABC):
       def __init__(self):
            print("I am a Shape")
       @abstractmethod
       def area(self):
            pass
       @abstractmethod
       def circumference(self):
            pass
class Circle(Shape):
       def __init__(self):
            super().__init__()
            print("I am a Circle")
       def area(self):
            radius = int(input("Enter the radius: "))
            print("Area of the Circle is %.2f." % ((22.0 / 7.0) * radius * radius))
       def circumference(self):
            radius = int(input("Enter the radius: "))
            print("Circumference of the Circle is %.2f." % (2 * (22.0 / 7.0) * radius))
class Rectangle(Shape):
       def __init__(self):
            super().__init__()
            print("I am a Rectangle")
       def area(self):
            length = int(input("Enter the length: "))
            breadth = int(input("Enter the breadth: "))
            print("Area of the Rectangle is %d." % (length * breadth))
       def circumference(self):
            length = int(input("Enter the length: "))
            breadth = int(input("Enter the breadth: "))
            print("Circumference of the Rectangle is %d." % (2 * (length + breadth)))
if __name__ == "__main__":
       s = Shape()
       #s.area()
       #s.circumference()
       c = Circle()
       c.area()
       c.circumference()
       r = Rectangle()
       r.area()
       r.circumference()

Cũng lưu ý rằng nếu một lớp dẫn xuất không triển khai tất cả các phương thức của lớp cơ sở trừu tượng của nó, thì lớp dẫn xuất đó cũng trở thành trừu tượng và không thể được khởi tạo. Trong trường hợp đó, chúng ta cần dẫn xuất một lớp từ lớp dẫn xuất và thực hiện các phương thức trừu tượng trong lớp đó.

Điều này được chứng minh bằng chương trình sau đây, trong đó class B là trừu tượng vì nó không triển khai test2() phương thức của nó abstract base class MỘT:

from abc import ABC,abstractmethod
class A(ABC):
     @abstractmethod
     def test1(self):
          pass
     @abstractmethod
     def test2(self):
          pass
class B(A):
     def test1(self):
          print("Hello")
class C(B):
     def test2(self):
         print("Welcome")
obj = C()
obj.test1()
obj.test2()

Sự kết luận

Tôi hy vọng người đọc thấy cuộc thảo luận ở trên hữu ích trong việc hiểu khái niệm trừu tượng khi được triển khai trong Python.