Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

คลาสพื้นฐานนามธรรมใน Python (abc)


คลาสจะเรียกว่าคลาสนามธรรมหากมีวิธีการที่เป็นนามธรรมตั้งแต่หนึ่งวิธีขึ้นไป วิธีนามธรรมคือวิธีการที่ประกาศ แต่ไม่มีการใช้งาน คลาสนามธรรมไม่สามารถสร้างอินสแตนซ์ได้ และเมธอดนามธรรมต้องดำเนินการโดยคลาสย่อย

คลาสพื้นฐานที่เป็นนามธรรมให้วิธีการกำหนดอินเทอร์เฟซเมื่อเทคนิคอื่น ๆ เช่น hasattr() จะงุ่มง่ามหรือผิดพลาดอย่างละเอียด (เช่น ด้วยวิธีการมายากล) ABCs แนะนำคลาสย่อยเสมือน ซึ่งเป็นคลาสที่ไม่ได้รับการสืบทอดจากคลาส แต่ยังคงรับรู้โดยฟังก์ชัน isinstance() และ issubclass() มี ABC ในตัวจำนวนมากใน Python ABC สำหรับโครงสร้างข้อมูล เช่น Iterator, Generator, Set, mapping เป็นต้น ถูกกำหนดไว้ในโมดูล collections.abc โมดูลตัวเลขกำหนดหอตัวเลขซึ่งเป็นชุดของคลาสพื้นฐานสำหรับประเภทข้อมูลตัวเลข โมดูล 'abc' ในไลบรารี Python มีโครงสร้างพื้นฐานสำหรับกำหนดคลาสฐานนามธรรมที่กำหนดเอง

'abc' ทำงานโดยทำเครื่องหมายวิธีการของคลาสฐานเป็นนามธรรม สิ่งนี้ทำโดย @absttractmethod มัณฑนากร คลาสที่เป็นรูปธรรมซึ่งเป็นคลาสย่อยของคลาสพื้นฐานที่เป็นนามธรรมนั้นจะใช้ฐานนามธรรมโดยการแทนที่เมธอดนามธรรมของมัน

โมดูล abc กำหนด ABCMeta คลาสซึ่งเป็น metaclass สำหรับกำหนดคลาสฐานนามธรรม ตัวอย่างต่อไปนี้กำหนดคลาส Shape เป็นคลาสพื้นฐานที่เป็นนามธรรมโดยใช้ ABCMeta คลาสรูปร่างมีเมธอด area() ที่ตกแต่งโดย abstractmethod

คลาส Rectangle ตอนนี้ใช้คลาส Shape ด้านบนเป็นพาเรนต์และใช้เมธอด abstract area() เนื่องจากเป็นคลาสที่เป็นรูปธรรมจึงสามารถสร้างอินสแตนซ์และเรียกใช้เมธอด area() ได้

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())

โปรดทราบว่าคลาสพื้นฐานที่เป็นนามธรรมอาจมีวิธีการที่เป็นนามธรรมมากกว่าหนึ่งวิธี คลาสลูกต้องใช้งานทั้งหมดล้มเหลวซึ่ง TypeError จะถูกยกขึ้น

โมดูล abc ยังกำหนด ABC คลาสตัวช่วยที่สามารถใช้แทนคลาส ABCMeta ในนิยามคลาสฐานนามธรรมได้

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

แทนที่จะจัดคลาสย่อยจากคลาสฐานนามธรรม มันสามารถลงทะเบียนเป็นนามธรรมฐานโดยลงทะเบียนมัณฑนากรคลาส

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

นอกจากนี้คุณยังสามารถจัดเตรียมวิธีการของคลาสและเมธอดแบบสแตติกในคลาสฐานนามธรรมโดยมัณฑนากร @abstractclassmethod และ @abstractstatic วิธีมัณฑนากรตามลำดับ