Obj-C (uzun zamandır kullanmamış olduğum), sınıfları genişletmek için categories adlı bir şeye sahiptir. Bir kategoriyi yeni yöntemlerle açıklamak ve programınıza derlemek, sınıfın tüm örnekleri aniden yeni yöntemlere sahiptir.Obj-C Kategoriler Python'da Nasıl Yapılır?
Python'un kullanabileceğim karıĢım olanakları vardır, ancak karıĢımlar programın altından kullanılmalıdır: sınıfın kendisini bildirmesi gerekir.
Öngörülen kategori kullanım durumu: Verilerle etkileşimde bulunmanın farklı yollarını açıklayan ve farklı özelliklere ulaşmak için polimorfik yollar açıklayan büyük bir sınıf hiyerarşiniz olduğunu varsayalım. Artık bir kategori, bu yöntemleri tek bir yerde kullanmak için uygun bir arayüz uygulayarak bu tanımlayıcı sınıfların tüketicisine yardımcı olabilir. (Bir kategori yöntemi, örneğin, iki farklı yöntemi deneyebilir ve ilk tanımlı (Non-None) dönüş değerini döndürür.)
Bunu Python'da yapmanın herhangi bir yolu var mı?
Örnek kod
Benumut bu ne demek istediğimi açıklık getirmektedir. Buradaki nokta, Kategorinin bir toplu arayüz olması, AppObj tüketicisinin kodunun kodunu değiştirebilmesidir.
class AppObj (object):
"""This is the top of a big hierarchy of subclasses that describe different data"""
def get_resource_name(self):
pass
def get_resource_location(self):
pass
# dreaming up class decorator syntax
@category(AppObj)
class AppObjCategory (object):
"""this is a category on AppObj, not a subclass"""
def get_resource(self):
name = self.get_resource_name()
if name:
return library.load_resource_name(name)
else:
return library.load_resource(self.get_resource_location())
, sen AppObj veya AppObjCategory örneğini ki? BTW Python, şu anda 2.6'da sınıf dekoratörlerine sahiptir: http://docs.python.org/whatsnew/2.6.html#pep-3129-class-decorators –
AppObj'yi (ve alt sınıflarını) örnekliyorum. Kategori kodu tamamen ayrı olabilir (yani AppObj bir kütüphanede, uygulamada Kategori olabilir). – u0b34a0f6ae
Belki de o zaman hemen Kategori sınıf dekoratörünü uygulamak için bir durum; Kategorideki tüm öznitelikleri temel sınıfa kopyalayın, .. __doc__ ve __dict__? gibi bazı öznitelikleri atlayın. – u0b34a0f6ae