Python Interfaces: เลือกโปรโตคอลเหนือ ABC
เหตุผลเชิงปฏิบัติหลายประการที่ทำให้ชอบโปรโตคอลใหม่ที่เป็นประกาย
ฉันใช้ไลบรารี Python มาตรฐานabcเพื่อกำหนดอินเทอร์เฟซในช่วง 10 ปีที่ผ่านมาในอาชีพการงานของฉัน แต่เมื่อเร็ว ๆ นี้ฉันพบว่า Python Protocols ที่ค่อนข้างใหม่ นั้นดีกว่ามาก ผู้คนพบการใช้งานทั้งสองเทคโนโลยี แต่ฉันต้องการโน้มน้าวให้คุณกระโดดเรือและเริ่มใช้มันแทนเทคนิคดั้งเดิม
Python interfaces: คุณใช้อะไรได้บ้าง?
Python ค่อนข้างแตกต่างจากภาษายอดนิยมอื่น ๆ เนื่องจากไม่มีส่วนต่อประสานในระดับภาษา แต่มีการใช้งานห้องสมุดหลายอย่าง แพ็คเกจ นี้abcน่าจะเป็นที่นิยมมากที่สุด:
from abc import ABC, abstractmethod
class Animal(ABC):
@abstractmethod
def eat(self, food) -> float:
pass
@abstractmethod
def sleep(self, hours) -> float:
pass
from zope.interface import Interface
class Animal(Interface):
def eat(self, food) -> float:
pass
def sleep(self, hours) -> float:
pass
ในที่สุดก็มีโปรโตคอล:
from typing import Protocol
class Animal(Protocol):
def eat(self, food) -> float:
...
def sleep(self, hours) -> float:
...
คุณควรใช้อะไร
คุณควรทราบว่าระบบอินเทอร์เฟซจะไม่ถูกแปลเป็นภาษาท้องถิ่นเป็นส่วนเล็กๆ ของโค้ดเบสของคุณ หลังจากที่คุณเลือกแล้ว คุณจะเห็นทุกที่และจะเปลี่ยนแปลงได้ยากในอนาคต ดังนั้น ฉันจะยกเลิกการใช้งานแบบกำหนดเองใดๆ ทันทีZopeหรือ เป็นการพึ่งพาเพิ่มเติมที่คุณต้องจัดการตลอดไป: การติดตั้ง เวอร์ชัน การสนับสนุน และอื่นๆ ตัวอย่างเช่น คุณต้องติดตั้งปลั๊กอิน Mypyเพื่อรองรับzope.interfaceบ่อน้ำ นอกจากนี้ นักพัฒนาใหม่ในทีมอาจไม่รู้จักแพ็คเกจแบบกำหนดเองนี้ และคุณจะต้องอธิบายว่าแพ็คเกจนี้คืออะไรและทำไมคุณถึงเลือกแพ็คเกจนี้
การรบหลักจะเกิดขึ้นระหว่างabcและ Protocolsแต่ถ้าคุณต้องการ การต่อสู้ zopevs Protocolsโปรดอ่าน บทวิเคราะห์โดย ละเอียดนี้
ตรวจสอบแบบคงที่ก่อน
ข้อสันนิษฐานใหญ่ ที่ฉันจะทำคือคุณมั่นใจแล้วว่าต้องมีการตรวจสอบแบบคงที่:คุณจะไม่รันโค้ดที่ล้มเหลว pylint/mypyหมากฮอสทั้งสองสนับสนุนabcและProtocolsเท่าเทียมกัน นอกจากนี้ โปรดทราบว่าทั้งสองabcและProtocolsอนุญาตการตรวจสอบรันไทม์ในกรณีที่คุณต้องการ
ทั้งสองสนับสนุนไวยากรณ์ที่ชัดเจน
ก่อนอื่น โปรดทราบว่าคุณยังคงสามารถสืบทอดจาก an abc และ a Protocolได้ อย่างชัดเจน ข้อโต้แย้งมากมายในวิดีโอที่ดีมาก (และความคิดเห็น) จากArjanเกี่ยวข้องกับความเข้าใจผิดที่ว่าคุณไม่สามารถทำเช่นนั้นได้ด้วยโปรโตคอล คุณสามารถ:
class Giraffe(Animal):
...
class Giraffe: # no base class needed!
def eat(self, food) -> float:
return 0.
def sleep(self, hours) -> float:
return 1.
def feed_animal(animal: Animal):
...
giraffe = Giraffe()
feed_animal(giraffe)
abcยังสนับสนุนอินเทอร์เฟซโดยปริยายผ่านแนวคิดของ " คลาสย่อยเสมือน " แต่คุณต้องเรียกregisterใช้ทุกครั้ง:
class Giraffe: # no base class needed!
def eat(self, food) -> float:
return 0.
class Animal(ABC):
...
Animal.register(Giraffe) # achieves the same as implicit Protocol
โปรโตคอลอนุญาตให้คุณกำหนดอินเทอร์เฟซสำหรับฟังก์ชัน(ไม่ใช่เฉพาะคลาส) — ดูที่โปรโตคอลการเรียกกลับ เป็นคุณสมบัติที่ยอดเยี่ยมมากซึ่งควรค่าแก่การโพสต์แยกต่างหาก
ทั้งสองรองรับวิธีการเริ่มต้น (น่าเสียดาย)
มีข้อเสียอย่างมากสำหรับทั้งabcและ Protocolsในโลกแห่งความเป็นจริง ผู้คนจำนวนมากทำงานในโค้ดเบสเดียว คลาสพื้นฐานที่เป็นนามธรรมบางครั้งมีแนวโน้มที่จะได้รับการใช้งานเมธอดเริ่มต้น นี่คือสิ่งที่อาจมีลักษณะดังนี้:
class Animal(Protocol): # the same holds for Animal(ABC):
def eat(self, food) -> float:
... # this is still abstract
def sleep(self, hours) -> float:
return 3.
โปรโตคอลสั้นกว่า
สุดท้าย แต่ไม่ท้ายสุด คุณสามารถนับจำนวนบรรทัดของโค้ดที่คุณต้องการเพื่อกำหนดอินเทอร์เฟซ ด้วยabcคุณต้องมีabstractmethodมัณฑนากรสำหรับทุกวิธี แต่ด้วยโปรโตคอลที่ไม่มีการตรวจสอบรันไทม์ คุณไม่จำเป็นต้องใช้ตัวตกแต่งใดๆ เลย ดังนั้นที่นี่โปรโตคอลจึงชนะ
บทสรุป
มารวมคะแนนกัน:
หวังว่าฉันจะไม่พลาดอะไรที่สำคัญในการวิเคราะห์นี้ เมื่อดูผลลัพธ์แล้ว ทีม“โปรโตคอล”ชนะ และคุณน่าจะเริ่มใช้มันได้แล้ว!
หากคุณพบว่าบทความนี้มีประโยชน์ ขอปรบมือให้ฉันหน่อย ขอบคุณสำหรับการอ่าน!
คุณสามารถหาฉันได้ที่LinkedInหรือTwitter
ทรัพยากร
- วิกิพิมพ์เป็ด
- บทช่วยสอนการพิมพ์เป็ดที่ดีจาก Taylor Manderson
- การเปรียบเทียบที่คล้ายกันระหว่าง Zope และโปรโตคอลจาก Glyph
- การเปรียบเทียบ ABC กับโปรโตคอลจาก Arjan
- อินเทอร์เฟซการทำงานพร้อมโปรโตคอลการโทรกลับ
เพิ่มระดับการเข้ารหัส
ขอบคุณที่เป็นส่วนหนึ่งของชุมชนของเรา! ก่อนที่คุณจะไป:
- ปรบมือให้กับเรื่องราวและติดตามผู้เขียน
- ดูเนื้อหาเพิ่มเติมในสิ่งพิมพ์ Level Up Coding
- ติดตามเรา: Twitter | LinkedIn | จดหมายข่าว





































![รายการที่เชื่อมโยงคืออะไร? [ส่วนที่ 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)