Computer >> Máy Tính >  >> Lập trình >> Python

Các lớp cơ sở trừu tượng trong Python (abc)

Một lớp được gọi là một lớp Trừu tượng nếu nó chứa một hoặc nhiều phương thức trừu tượng. Một phương thức trừu tượng là một phương thức được khai báo, nhưng không chứa phần thực thi. Các lớp trừu tượng có thể không được khởi tạo và các phương thức trừu tượng của nó phải được các lớp con của nó thực hiện.

Các lớp cơ sở trừu tượng cung cấp một cách để xác định giao diện khi các kỹ thuật khác như hasattr () sẽ vụng về hoặc sai một cách tinh vi (ví dụ với các phương thức ma thuật). ABC giới thiệu các lớp con ảo, là các lớp không kế thừa từ một lớp nhưng vẫn được nhận dạng bởi các hàm isinstance () và Issubclass (). Có rất nhiều ABC được tích hợp sẵn trong Python. ABC cho cấu trúc dữ liệu như Iterator, Generator, Set, ánh xạ, v.v. được định nghĩa trong mô-đun collection.abc. Mô-đun số định nghĩa tháp số là tập hợp các lớp cơ sở cho các kiểu dữ liệu số. Mô-đun 'abc' trong thư viện Python cung cấp cơ sở hạ tầng để xác định các lớp cơ sở trừu tượng tùy chỉnh.

'abc' hoạt động bằng cách đánh dấu các phương thức của lớp cơ sở là trừu tượng. Điều này được thực hiện bởi @absttractmethod decorator. Một lớp cụ thể là lớp con của lớp cơ sở trừu tượng đó sau đó triển khai cơ sở trừu tượng bằng cách ghi đè các phương thức trừu tượng của nó.

Mô-đun abc xác định ABCMeta lớp là siêu kính để xác định lớp cơ sở trừu tượng. Ví dụ sau định nghĩa lớp Shape là một lớp cơ sở trừu tượng bằng cách sử dụng ABCMeta. Lớp hình dạng có phương thức area () được trang trí bởi abstractmethod.

Một lớp Rectangle bây giờ sử dụng lớp Shape bên trên làm lớp cha của nó và thực hiện phương thức abstract area (). Vì nó là một lớp cụ thể, nó có thể được khởi tạo và phương thức imlemented area () có thể được gọi.

import abc
class Shape(metaclass=abc.ABCMeta):
   @abc.abstractmethod
   def area(self):
      pass
class Rectangle(Shape):
   def __init__(self, x,y):
      self.l = x
      self.b=y
   def area(self):
      return self.l*self.b
r = Rectangle(10,20)
print ('area: ',r.area())

Lưu ý rằng lớp cơ sở trừu tượng có thể có nhiều hơn một phương thức trừu tượng. Lớp con phải triển khai tất cả chúng nếu không thực hiện được TypeError.

mô-đun abc cũng xác định ABC lớp trợ giúp có thể được sử dụng thay cho lớp ABCMeta trong định nghĩa của lớp cơ sở trừu tượng.

class Shape(abc.ABC):
   @abc.abstractmethod
   def area(self):
      pass

Thay vì phân lớp từ lớp cơ sở trừu tượng, nó có thể được đăng ký dưới dạng cơ sở trừu tượng bằng trình trang trí lớp đăng ký.

class Shape(abc.ABC):
   @abc.abstractmethod
   def area(self):
      pass
@Shape.register
class Rectangle():
   def __init__(self, x,y):
   self.l = x
   self.b=y
   def area(self):
      return self.l*self.b

Bạn cũng có thể cung cấp các phương thức lớp và phương thức tĩnh trong lớp cơ sở trừu tượng bởi trình trang trí @abstractclassmethod và @abstractstatic phương thức trang trí tương ứng.