İşlevlerimin çoğunun gerçekleştirdiği kodu azaltmak için dekoratör veya başka bir Pythonic yolu kullanmayı denemem gerektiğini belirlemeye çalışıyorum. Bu işlevlerin, her bir fonksiyonun başlangıcında sadece bir başka işlevi çağırmasını veya her bir fonksiyonun başlangıcını "bir şekilde" "dekore etmesini" istiyorum. Daha önce hiç dekoratör kullanmamıştım ve her bir işlevdeki ortak paylaşım kodunu azaltmak için bu dekorasyon fikrini pythonic bir şekilde uygulamakta zorlanıyorum.Bir işlevi süslemeli miyim?
İşlev başlangıcında aynı adımları gerçekleştirecek birçok işlev var. Ancak, zor bu "dekoratör" fikrini yapar ortak kod bazı yapı endişeler vardır:
fonksiyonları tüm bir üst sınıfın alt sınıfında bulunmaktadır.
işlevleri arasında ortak komutları fonksiyonu (ancak işlev adı bir alt kümesi) özgü değişken isimleri referans.
Genel komutlar, belirli bir koşul karşılanırsa, arayan kişiye geri dönmeli ve herhangi bir çocuk işlevinin daha fazlasını yürütmemelidir. ("Jobj eğer:" örnek kod bloğu) değişkeni için
/örnekler bağlıyor, çocuk fonksiyonu get_nas_server (öz) kod ortak setinde "nas_server" değişken varyantları kullanacak. Get_ işlev adından çıkarıldığında, ortak kod kümesinde kullanılacak değişken adının tabanı ortaya çıkar. "Get_nas_server" fonksiyonu addan Örnek değişkenler isim ve nesne özellikleri:
nas_server
nas_server.json
self.nas_server (özellik)
Burada
işlevlerinden biri tarafından yaygın kodudur:
####################################################################
def get_nas_server(self):
####################################################################
"""\nGets COMMAND nas_server and places data into self.nas_server"""
try:
self.nas_server
return self.nas_server
except AttributeError:
pass
self.get_file_cmd('nas_server')
jobj = self.fresh_json('nas_server.json')
if jobj :
self.nas_server = jobj
return self.nas_server
self.get_file_cmd('get_nas_server')
İşlevdeki yukarıdaki kodun altındaki her şey, işlev amacına özeldir ve burada tartışmaya uygun değildir. Temel olarak, yukarıdaki tüm kodları işlevlerimde yeniden kullanılabilir hale getirmeye çalışıyorum, ancak kodun işlev adına bağlı olarak değişkenlere ve özniteliklere sahip olması gerekir.
Şimdiye kadar aldığınız için teşekkür ederiz ve tüm yardımlarınız için teşekkürler. Bu pasajı gösteren
class Parent(object):
def _get_something(name):
try:
return getattr(self, name)
except AttributeError:
pass
self.get_file_cmd(name)
jobj = self.fresh_json(name+'.json')
if jobj :
setattr(self, name, jobj)
return jobj
self.get_file_cmd('get_'+name)
olarak, nesne adıyla niteliklerini başvurmak için getattr()
, setattr()
ve hasattr()
işlevleri kullanabilirsiniz:
Teşekkür: Burada
çocuk yöntem bu ana yöntemini kullanır şekli: İşte
Augurar önerdi çoğunlukla olarak üst sınıf yöntemidir. Varolan işleve eklenecek kod, özgün koşullara geri dönebilmeli ve belirli koşullar yerine getirildiyse artık kod yürütmemelidir. Durum gereksinimi bir yardımcı yöntemle mümkün görünmüyorsa bu "dönüş". – Fragtzack@Fragtzack Doğru, ancak bunu yardımcı olarak çağıran birkaç satırda yapabilirsiniz. – augurar
tamam, bunu deneyecek. Bu yardımcıyı çağıran fonksiyonda, bu yardımcıyı sadece bir self._get_something ('nas_server') olarak adlandırıyorum? – Fragtzack