SORU
24 Aralık 2008, ÇARŞAMBA


(Somut) Python metaclasses için kullanım durumları nelerdir?

Metaclasses kullanmayı seviyor ve düzenli bir çözüm olarak teklif eden bir arkadaşım var.

Neredeyse hiç metaclasses kullanması gereken aklın ediyorum. Neden? eğer bir sınıf için böyle bir şey yapıyorsun eğer düşünüyorum çünkü, muhtemelen bir nesne için bunu yapıyor olmalı. Ve küçük yeniden/yeniden düzene girdi.

Kullanabilme metaclasses çok yerde bir çok insan bana korkunç görünüyor ki, ikinci sınıf bir nesne, bir tür olarak sınıfları kullanmak için neden oldu. Programlama meta-programlama ile değiştirilebilir mi? Sınıf dekoratörler ayrıca ne yazık ki o bile daha kabul edilebilir yaptı.

Bu yüzden lütfen, durumlarda kullanın Python metaclasses için (somut) geçerli bilmek için yanıp tutuşuyorum. Ya da mutasyona sınıfları mutasyona nesneleri daha iyi neden olarak aydınlanmış olmak üzere, bazen.

Başlayacak:

Kullanırken bazen bir üçüncü taraf kütüphane faydalı olabilir. belirli bir şekilde sınıf mutasyona.

(bu aklıma gelen tek durum, somut değil)

CEVAP
24 Aralık 2008, ÇARŞAMBA


Metaclasses amacı metaclass/class sınıf/nesne ayrımı yerine değil - bir şekilde sınıf tanımları (ve böylece örneklerini) davranışlarını değiştirmek için. Etkin varsayılan daha belirli bir etki için daha yararlı olabilecek şekilde sınıf deyim davranışlarını değiştirmek. Hep ben ben ben ben şey vardır:

  • İzleme alt sınıflar, genellikle işleyicileri kayıt. Bu sadece sınıflara ve birkaç sınıf öznitelikleri ayarlayarak belirli bir şey için bir işleyicisi kaydetmek istediğiniz eklenti tarzı bir kurulum kullanırken çok kullanışlı. örn. her sınıf için uygun yöntem (play / etiketler alsınlar türü için uygular çeşitli müzik biçimleri için bir işleyici yazmak, varsayalım. Yeni bir türü için bir işleyici olur ekleme:

    class Mp3File(MusicFile):
        extensions = ['.mp3']  # Register this type as a handler for mp3 files
        ...
        # Implementation of mp3 methods go here
    

    Bu metaclass sonra {'.mp3' : MP3File, ... } sözlük gibi korur, ve bir fabrika işlevi ile bir işleyici istemek için uygun türde bir nesne oluşturur.

  • Davranış değiştirme. Hazır olduklarında belirli nitelikleri, değişmiş davranış sonucu özel bir anlam isteyebilirsiniz. Örneğin, adı _get_foo _set_foo yöntemleri için bakmak isteyebilirsiniz ve şeffaf özellikleri onları dönüştürmek. Gerçek dünyadan bir örnek olarak, here's C-daha vermek için yazdığım bir reçete tanımları yapı. Bu metaclass yapı biçiminde bir dizeye ilan öğeler dönüştürmek, miras vb işleme, ve bir sınıf ile baş edebilecek üretmek için kullanılır.

    Gerçek dünyadaki diğer örnekler için bak sqlalchemy's ORM veya sqlobject gibi çeşitli ORMs. Yine, amaç belirli bir anlam tanımlamalarını (burada sütun tanımları SQL) yorumlamak.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • KarnasCamillo

    KarnasCamill

    24 EKİM 2007
  • kimaliz

    kimaliz

    18 Temmuz 2006
  • Wild Academy

    Wild Academy

    8 Aralık 2009