Python Arayüzleri: ABC Üzerinden Protokolleri Seçin
Yeni parlak Protokolleri tercih etmek için birkaç pratik neden
abcKariyerimin son 10 yılında arayüzleri tanımlamak için standart bir Python kütüphanesi kullandım . Ancak son zamanlarda, nispeten yeni Python Protokollerinin çok daha iyi olduğunu buldum . İnsanlar her iki teknoloji için de kullanım alanları buluyor. Ama sizi tamamen gemilerden atlamaya ve daha geleneksel teknikler yerine onları kullanmaya ikna etmek istiyorum.
Python arayüzleri: ne kullanabilirsiniz?
Python, diğer popüler dillerden biraz farklıdır, çünkü dil düzeyinde arayüz yoktur. Ancak birkaç kütüphane uygulaması var. Paket abcmuhtemelen en popüler olanıdır:
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
Son olarak, protokoller vardır:
from typing import Protocol
class Animal(Protocol):
def eat(self, food) -> float:
...
def sleep(self, hours) -> float:
...
Ne kullanmalısın?
Bir arayüz sisteminin kod tabanınızın küçük bir kısmına yerelleştirilemeyeceğini bilmelisiniz. Biriyle gitmeye karar verdikten sonra onu her yerde göreceksin ve gelecekte değiştirmek zor olacak. Bu nedenle, herhangi bir özel uygulamayı veya Zope. Sonsuza dek uğraşmanız gereken ekstra bir bağımlılık: kurulum, sürümler, destek vb. Örneğin, bir kuyuyu desteklemek için bir Mypy eklentisi kurmanız gerekir zope.interface. Ek olarak, ekipteki yeni bir geliştirici bu özel paketi bilmeyebilir ve bunun ne olduğunu ve neden onu seçtiğinizi açıklamanız gerekir.
abcAna savaş ve arasında gerçekleşecek Protocols. zopeAma gerçekten bir savaş istiyorsanız Protocols, lütfen bu ayrıntılı analizi okuyun .
Önce statik kontrol
Yapacağım büyük varsayım, statik kontrolün bir zorunluluk olduğuna zaten ikna olduğunuzdur : başarısız olan kodu çalıştırmayacaksınız pylint/mypy. Her iki dama da destekliyor abcve Protocolseşit derecede iyi. Ayrıca, her ikisini de bilin abcve Protocolsihtiyacınız olması durumunda çalışma zamanı kontrolüne izin verin.
Her ikisi de açık sözdizimini destekler
abc Öncelikle, an ve a'dan açıkça miras alabileceğinizi unutmayın Protocol. Arjan'ın çok iyi bir videosundaki (ve yorumlarındaki) birçok argüman, bunu protokollerle yapamayacağınız yanılgısı etrafında dönüyor. Kesinlikle şunları yapabilirsiniz:
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)
abcayrıca " sanal alt sınıflar " kavramı aracılığıyla örtük arabirimleri de destekler . registerAncak her uygulama için aramanız gerekir :
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
Protokoller, bir işlev (yalnızca bir sınıf için değil) için bir arabirim tanımlamanıza izin verir — geri arama protokollerine bakın . Ayrı bir gönderiye layık çok güzel bir özellik.
Her ikisi de varsayılan yöntemleri destekler (maalesef)
abcHer ikisinin de büyük bir dezavantajı var Protocols. Gerçek dünyada birçok kişi tek bir kod tabanında çalışır. Soyut temel sınıflar bazen varsayılan yöntem uygulamalarını edinme eğilimindedir. Şöyle görünebilir:
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.
Protokoller daha kısadır
Son olarak, bir arayüz tanımlamak için ihtiyacınız olan kod satırlarının sayısını sayabilirsiniz. ile , her yöntem için abcbir dekoratörünüz olmalıdır . abstractmethodAncak, çalışma zamanı denetimi olmayan Protokoller ile herhangi bir dekoratör kullanmanız gerekmez. Yani burada, Protokoller kesinlikle kazanıyor.
Çözüm
Puanları toplayalım:
Umarım, bu analizde çok büyük bir şey kaçırmıyorum. Sonuçlara bakıldığında, "Protokoller" takımı kazanıyor ve muhtemelen onu kullanmaya başlamalısınız!
Bu makaleyi yararlı bulduysanız, beni biraz alkışlayın. Okuduğunuz için teşekkürler!
Beni LinkedIn veya Twitter'da bulabilirsiniz .
Kaynaklar
- Ördek yazarak wiki
- Taylor Manderson'dan iyi ördek yazma eğitimi
- Glyph'ten Zope ve Protocols arasında benzer bir karşılaştırma
- Arjan'dan ABC ve Protokol karşılaştırması
- Geri çağırma protokollerine sahip fonksiyonel arayüzler
Seviye Atlama Kodlama
Topluluğumuzun bir parçası olduğunuz için teşekkürler! Gitmeden önce:
- Hikaye için alkışlayın ve yazarı takip edin
- Seviye Atlama Kodlama yayınında daha fazla içerik görüntüleyin
- Bizi takip edin: Twitter | LinkedIn | Bülten

![Bağlantılı Liste Nedir? [Bölüm 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































