SORU
25 Mart 2009, ÇARŞAMBA


Python Sınıf Dekoratör

2.5 bir sınıf süsleyen bir dekoratör oluşturmak için Python? Özellikle, bir sınıfa üye ekleme ve kurucu üye için bir değer almak için değiştirmek için bir dekoratör kullanmak istiyorum.

Aşağıdaki gibi bir şeyler arıyor, bir sözdizimi hatası ('class Foo:':

def getId(self): return self.__id

class addID(original_class):
    def __init__(self, id, *args, **kws):
        self.__id = id
        self.getId = getId
        original_class.__init__(self, *args, **kws)

@addID
class Foo:
    def __init__(self, value1):
        self.value1 = value1

if __name__ == '__main__':
    foo1 = Foo(5,1)
    print foo1.value1, foo1.getId()
    foo2 = Foo(15,2)
    print foo2.value1, foo2.getId()

Teşekkürler Rob

Düzenleme: Bu soruyu okuyana sanırım gerçekten istediğim bir C gibi bir şey yapmak için bir yoldur# Python arayüzü. Sanırım benim paradigma değiştirmemiz lazım.

CEVAP
25 Mart 2009, ÇARŞAMBA


İster sınıf dekoratörler soru dışında sorunun doğru çözümü:

Python 2.6 ve üstü, yazma @-sözdizimi: sınıf dekoratörler vardır

@addID
class Foo:
    pass

eski sürümlerinde, bunu başka bir şekilde yapabilirsiniz:

class Foo:
    pass

Foo = addID(Foo)

Bu işlev, dekoratör olarak çalışan ve dekoratör (orijinal ya da değiştirilmiş), yeni sınıf, dönmelidir bu örnekte ne yaptığını değil, ancak unutmayın. AddİD dekoratör bu gibi görünecektir:

def addID(original_class):
    orig_init = original_class.__init__
    # make copy of original __init__, so we can call it without recursion

    def __init__(self, id, *args, **kws):
        self.__id = id
        self.getId = getId
        orig_init(self, *args, **kws) # call the original __init__

    original_class.__init__ = __init__ # set the class' __init__ to the new one
    return original_class

Sonra, yukarıda açıklandığı gibi python sürümü için uygun sözdizimini kullanabilirsiniz.

Ama miras __init__ geçersiz kılmak isterseniz daha uygun diğerlerine katılıyorum.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • backyardjay

    backyardjay

    8 ŞUBAT 2009
  • Justin Schenck

    Justin Schen

    24 Kasım 2006
  • SunsetTrance

    SunsetTrance

    20 EYLÜL 2008