Sorun
Ana sınıfı biraz “ Tanrı Nesnesi ” olan bir Python projesi üzerinde çalışıyorum . Vardır bu yüzden birçok özellik ve yöntemlere friggin!
Sınıfa yeniden bakmak istiyorum.
Şimdiye kadar…
İlk adım olarak, nispeten basit bir şey yapmak istiyorum; ama en basit yaklaşımı denediğimde, bazı testler ve mevcut örnekler kırıldı.
Temelde, sınıfın özniteliklerin bir listesi var - ama açıkça onlara bakabilir ve “Bu 5 nitelik birbiriyle ilişkilidir… Bu 8 de ilişkilidir… ve sonra gerisi var.”
getattr
Temelde sadece ilgili özellikleri dikte benzeri bir yardımcı sınıfta gruplamak istedim. __getattr__
İş için ideal olacağını düşündüm . Bu yüzden nitelikleri ayrı bir sınıfa taşıdım ve eminim __getattr__
sihrini mükemmel şekilde çalıştı…
İlk başta .
Ama sonra örneklerden birini çalıştırmayı denedim. Örnek alt sınıf, bu niteliklerden birini doğrudan ( sınıf düzeyinde ) ayarlamaya çalışır . Ancak, öznitelik artık üst sınıfta “fiziksel olarak” bulunmadığından, özniteliğin var olmadığını söyleyen bir hata aldım.
@Emlak
Sonra @property
dekoratör hakkında okudum . Ama sonra da ana sınıfın bir özelliği self.x = blah
olduğunda yapmak istediğiniz alt sınıflar için problemler yarattığını okudum x
.
İstenen
self.whatever
Ebeveyninwhatever
özelliği sınıfın (veya örneğin) kendisinde "fiziksel olarak" bulunmasa bile, tüm istemci kodunun çalışmaya devam etmesini sağlayın.- İlgili nitelikleri dikte benzeri kaplarda gruplayın.
- Ana sınıftaki kodun aşırı gürültüsünü azaltın.
Örneğin, ben yok sadece bunu değiştirmek istiyorum:
larry = 2
curly = 'abcd'
moe = self.doh()
Bunun içine:
larry = something_else('larry')
curly = something_else('curly')
moe = yet_another_thing.moe()
… Çünkü bu hala gürültülü. Bu, verileri yönetebilen bir şeye başarılı bir şekilde basit bir öznitelik oluştursa da, orijinalin 3 değişkeni vardı ve düzeltilmiş versiyonun hala 3 değişkeni var.
Ancak, böyle bir şeyle iyi olurdu:
stooges = Stooges()
Ve eğer bir arama self.larry
başarısız olursa, bir şey orada olup olmadığını kontrol eder stooges
ve görür larry
. (Ancak, bir alt larry = 'blah'
sınıf sınıf düzeyinde yapmaya çalışırsa da çalışmalıdır .)
özet
- Bir üst sınıftaki ilgili özellik gruplarını, tüm verileri başka bir yerde depolayan tek bir özellikle değiştirmek istiyorum
larry = 'blah'
Sınıf düzeyinde (ör.) Kullanan mevcut istemci koduyla çalışmak istiyorum- Alt sınıfların, hiçbir şey değiştiğini bilmeden bu yeniden düzenlenmiş özellikleri genişletmesine, geçersiz kılmasına ve değiştirmesine izin vermeye devam etmek istiyorum
Mümkün mü? Yoksa yanlış ağacı mı havlıyorum?