คลาสจะเรียกว่าคลาสนามธรรมหากมีวิธีการที่เป็นนามธรรมตั้งแต่หนึ่งวิธีขึ้นไป วิธีนามธรรมคือวิธีการที่ประกาศ แต่ไม่มีการใช้งาน คลาสนามธรรมไม่สามารถสร้างอินสแตนซ์ได้ และเมธอดนามธรรมต้องดำเนินการโดยคลาสย่อย
คลาสพื้นฐานที่เป็นนามธรรมให้วิธีการกำหนดอินเทอร์เฟซเมื่อเทคนิคอื่น ๆ เช่น 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 วิธีมัณฑนากรตามลำดับ