Python üzerinde çalışıyorum. Genel bir api ortaya koyan bir kütüphanenin nasıl tasarlanacağını anlamaya çalışıyorum. Gelecekte değişebilecek içsel yöntemleri ortaya çıkarmaktan kaçınmak istiyorum. Bunu yapmak için basit ve pythonic bir yol arıyorum. Bir grup dersi içeren bir kütüphanem var. Bu sınıfların bazı yöntemleri sınıflar arasında dahili olarak kullanılır. Bu yöntemleri istemci koduna maruz bırakmak istemiyorum. İç mimarları ortaya çıkarmaktan kaçınan bir kütüphane api nasıl tasarlanır?
Kütüphanemin (F. E.mylib
) iki yöntem istemci kodu ve kütüphane koduna bazı işler yapmak için kullanılan
C.internal()
yönteminden kullanıldığı düşünülmektedir bir
C.public()
yöntem ile bir sınıf
C
içerdiğini varsayalım. Kendimi genel api'ye (
C.public()
) dahil etmek istiyorum ancak ileride parametrelerin eklenmesi veya kaldırılması için
C.internal()
yöntemini değiştirmeyi umuyorum.
mylib/c.py
:
class C:
def public(self):
pass
def internal(self):
pass
mylib/f.py
:
class F:
def build():
c = C()
c.internal()
return c
mylib/__init__.py
:
from mylib.c import C
from mylib.f import F
Aşağıdaki kod sorumu göstermektedir
client/client.py
:
import mylib
f = mylib.F()
c = f.build()
c.public()
c.internal() # I wish to hide this from client code
ben düşündüm aşağıdaki çözümleri:
belge yalnızca kamu API, özel kütüphane api kullanmayın için belgelerinde kullanıcıyı ikaz. Müşterilerin sadece halka api kullanacağını umarak huzur içinde yaşayın. Bir sonraki kütüphane sürümü istemci kodunu kırıyorsa, istemci arızası :). Bir tür adlandırma kuralı kullanın, örn. önek "_" ile her bir yöntem, (korunan yöntemler için ayrılmıştır ve ide'ye uyarı verir), belki de diğer önekleri kullanabilirim. İç yöntemleri gizlemek için nesne bileşimini kullanın. Örneğin, kitaplık, nesnelerinin
C
nesnelerini yerleştirdiği yalnızcaPC
nesnesine geri dönebilir.
mylib/pc.py
class PC:
def __init__(self, c):
self.__c__
def public(self):
self.__cc__.public()
Ama bu biraz yapmacık görünüyor.
Herhangi bir öneri bu soru Bu benzer soru ama kapsamı hakkında biraz farklıdır Does Python have “private” variables in classes?
arasında yineleniyor olduğu öne sürüldü
Güncelleme
:-) takdir edilmektedir. Benim kapsamım tek bir sınıf değil bir kütüphanedir.Bir kütüphanenin kamu metotları/sınıfları/fonksiyonları olan işaretleme (veya zorlama) hakkında bazı kurallar var mı diye merak ediyorum. Örneğin, genel sınıfları veya işlevleri vermek için __init__.py
kullanın. Sınıf yöntemlerini dışa aktarma ya da yalnızca belgelere güvenebileceğim bazı kurallar var mı diye merak ediyorum. Korunan yöntemleri işaretlemek için "_" önekini kullanabileceğimi biliyorum. Bildiğim kadarıyla korunan yöntem, sınıf hiyerarşisinde kullanılabilecek bir yöntemdir.
Bir dekoratör @api
Sphinx Public API documentation ile genel yöntem işaretleme hakkında bir soru buldum ama yaklaşık 3 yıl önce oldu. Yaygın olarak kabul edilen bir çözüm var, bu yüzden eğer birisi benim kodumu okuyorsa, kütüphane halkı api olması için tasarlanan yöntemleri ve kütüphanede dahili olarak kullanılması amaçlanan yöntemleri anlıyor musunuz? Umut Sorularımı açıklığa kavuşturdum. Herkese teşekkürler!
Olası çoğaltılabilir [Python'un sınıflarında “özel” değişkenleri var mı?] (Http://stackoverflow.com/questions/1641219/does-python-have-private-variables-in-classes –
Özel şeyler yapmak için yolumdan çıkmamalısınız, Pythonic değil – Anentropic
Belirtilen '@ API 'çoğunlukla belgeleme amaçlıdır. – Nikita