Antarmuka Python: Pilih Protokol Di Atas ABC
Beberapa alasan praktis untuk memilih Protokol baru yang mengkilap
Saya menggunakan pustaka Python standar abcuntuk mendefinisikan antarmuka selama 10 tahun terakhir karir saya. Namun baru-baru ini, saya menemukan bahwa Protokol Python yang relatif baru jauh lebih bagus. Orang-orang menemukan kegunaan untuk kedua teknologi tersebut. Tapi saya ingin meyakinkan Anda untuk benar-benar melompati kapal dan mulai menggunakannya daripada teknik yang lebih tradisional.
Antarmuka Python: apa yang bisa Anda gunakan?
Python agak berbeda dari bahasa populer lainnya karena tidak ada antarmuka pada tingkat bahasa. Tetapi ada beberapa implementasi perpustakaan. Paket ini abcmungkin yang paling populer:
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
Akhirnya, ada protokol:
from typing import Protocol
class Animal(Protocol):
def eat(self, food) -> float:
...
def sleep(self, hours) -> float:
...
Apa yang harus Anda gunakan?
Anda harus tahu bahwa sistem antarmuka tidak akan dilokalkan ke sebagian kecil basis kode Anda. Setelah Anda memilih untuk menggunakan satu, Anda akan melihatnya di mana-mana, dan akan sulit untuk mengubahnya di masa mendatang. Jadi saya akan segera mengabaikan implementasi khusus atau Zope. Ini adalah ketergantungan ekstra yang harus Anda tangani selamanya: penginstalan, versi, dukungan, dan seterusnya. Misalnya, Anda harus memasang plugin Mypy untuk mendukung zope.interfacesumur. Selain itu, pengembang baru dalam tim mungkin tidak mengetahui paket khusus ini, dan Anda harus menjelaskan apa itu dan mengapa Anda memilihnya.
Pertempuran utama akan terjadi antara abcdan Protocols. Tetapi jika Anda benar-benar menginginkan pertarungan zopevs Protocols, silakan baca analisis terperinci ini .
Pemeriksaan statis terlebih dahulu
Asumsi besar yang akan saya buat adalah Anda sudah yakin bahwa pemeriksaan statis adalah suatu keharusan : Anda tidak akan menjalankan kode yang gagal pylint/mypy. Kedua checker mendukung abcdan Protocolssama baiknya. Juga, ketahuilah bahwa keduanya abcdan Protocolsizinkan pemeriksaan runtime, jika Anda membutuhkannya.
Keduanya mendukung sintaks eksplisit
Pertama, perhatikan bahwa Anda masih dapat mewarisi secara eksplisit dari an abc dan a Protocol. Banyak argumen dalam video (dan komentar) yang sangat bagus dari Arjan berkisar pada kesalahpahaman bahwa Anda tidak dapat melakukannya dengan protokol. Anda benar-benar dapat:
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)
abcjuga mendukung antarmuka implisit melalui konsep " subclass virtual ". Tetapi Anda harus memanggil registersetiap implementasi:
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
Protokol memungkinkan Anda menentukan antarmuka untuk suatu fungsi (tidak hanya kelas) — lihat callback protocols . Ini adalah fitur yang sangat keren yang layak untuk posting terpisah.
Keduanya mendukung metode default (sayangnya)
Ada kerugian besar bagi keduanya abcdan Protocols. Di dunia nyata, banyak orang bekerja dalam satu basis kode. Kelas dasar abstrak terkadang cenderung memperoleh implementasi metode default. Ini mungkin terlihat seperti ini:
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.
Protokol lebih pendek
Last but not least, Anda dapat menghitung jumlah baris kode yang Anda perlukan untuk mendefinisikan sebuah antarmuka. Dengan abc, Anda harus memiliki abstractmethoddekorator untuk setiap metode. Tetapi dengan Protokol tanpa pemeriksaan runtime, Anda tidak perlu menggunakan dekorator sama sekali. Jadi di sini, Protokol menang telak.
Kesimpulan
Mari kita tambahkan skornya:
Mudah-mudahan, saya tidak melewatkan sesuatu yang besar dalam analisis ini. Melihat hasilnya, tim "Protokol" menang, dan Anda mungkin harus mulai menggunakannya!
Jika Anda menemukan artikel ini bermanfaat, beri saya tepuk tangan. Terima kasih telah membaca!
Anda dapat menemukan saya di LinkedIn atau Twitter .
Sumber daya
- Wiki mengetik bebek
- Tutorial mengetik bebek yang bagus dari Taylor Manderson
- Perbandingan serupa antara Zope dan Protokol dari Glyph
- Perbandingan ABC vs Protokol dari Arjan
- Antarmuka fungsional dengan protokol panggilan balik
Tingkatkan Pengkodean
Terima kasih telah menjadi bagian dari komunitas kami! Sebelum kamu pergi:
- Tepuk tangan untuk ceritanya dan ikuti penulisnya
- Lihat lebih banyak konten di publikasi Level Up Coding
- Ikuti kami: Twitter | LinkedIn | Buletin

![Apa itu Linked List? [Bagian 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































