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

Abstract Base Classes ใน Python (abc)


คลาสจะถูกเรียกว่า Abstract class หากมันมี abstract methods หนึ่งหรือมากกว่า Abstract method คือเมธอดที่ประกาศไว้ แต่ไม่มีการ implement Abstract classes อาจไม่ถูก instantiate และ abstract methods ของมันต้องถูก implement โดย subclasses ของมัน

Abstract base classes ให้วิธีในการกำหนด interfaces เมื่อเทคนิคอื่นๆ เช่น hasattr() จะ clumsy หรือผิดเล็กน้อย (เช่นกับ magic methods) ABCs นำเสนอ virtual subclasses ซึ่งเป็นคลาสที่ไม่ได้ inherit จากคลาสหนึ่งแต่ยังถูก recognize โดย isinstance() และ issubclass() functions มี built-in ABCs หลายตัวใน Python ABCs สำหรับ Data structures เช่น Iterator, Generator, Set, mapping เป็นต้น ถูกกำหนดในโมดูล collections.abc โมดูล numbers กำหนด numeric tower ซึ่งเป็นชุดของ base classes สำหรับ numeric data types โมดูล 'abc' ในไลบรารี Python ให้โครงสร้างพื้นฐานสำหรับกำหนด custom abstract base classes

'abc' ทำงานโดยการ mark เมธอดของ base class ว่าเป็น abstract การทำนี้ทำโดย decorator @absttractmethod คลาส concrete ที่เป็น sub class ของ abstract base class แล้ว implement abstract base โดยการ override abstract methods ของมัน

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

คลาส Rectangle ตอนนี้ใช้คลาส Shape ข้างต้นเป็น parent และ implement abstract area() method เนื่องจากเป็น concrete class มันสามารถ instantiate ได้และ implemented area() method สามารถเรียกได้

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

สังเกตว่า abstract base class อาจมี abstract methods มากกว่าหนึ่ง Child class ต้อง implement ทั้งหมด มิฉะนั้น TypeError จะถูกยกขึ้น

โมดูล abc ยังกำหนดคลาส ABC helper ซึ่งสามารถใช้แทน ABCMeta class ในการกำหนด abstract base class ได้

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

แทนที่จะ subclass จาก abstract base class มันสามารถลงทะเบียนเป็น abstract base ได้โดย register class decorator

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

คุณอาจให้ class methods และ static methods ใน abstract base class ด้วย decorators @abstractclassmethod และ @abstractstaticmethod ตามลำดับ