SORU
2 Mart 2010, Salı


Bir örnek yöntemi Python bir dekoratör sınıf erişebilir?

Merhaba kabaca aşağıdaki gibi bir şey var. Temelde bir dekoratör tanımını örnek yöntemi üzerine kullanılan örnek yönteminin sınıf giriş yapmam gerek.

def decorator(view):
    # do something that requires view's class
    print view.im_class
    return view

class ModelA(object):
    @decorator
    def a_method(self):
        # do some stuff
        pass

Kod olarak verir

AttributeError: 'function' object has no attribute 'im_class'

/- Python decorator makes function forget that it belongs to a class Get class in Python decorator - ama bu ilk parametre kapış tarafından çalışma zamanında örnek kapmak geçici bir çözüm güvenmek cevaplar benzer soru buldum. Benim durumumda bu bilgiyi kendi sınıf panoda dayalı yöntem arayacağım, gelip bir çağrı için sabırsızlanıyorum.

Teşekkür ederim.

CEVAP
2 Mart 2010, Salı


Eğer Python 2.6 kullanıyorsanız veya sınıf bir dekoratör kullanabilirsiniz daha sonra, belki böyle bir şey (uyarı: denenmemiş kodu).

def class_decorator(cls):
   for name, method in cls.__dict__.iteritems():
        if hasattr(method, "use_class"):
            # do something with the method and class
            print name, cls
   return cls

def method_decorator(view):
    # mark the method as something that requires view's class
    view.use_class = True
    return view

@class_decorator
class ModelA(object):
    @method_decorator
    def a_method(self):
        # do some stuff
        pass

Yöntem dekoratör "use_class" öznitelik fonksiyonları ve yöntemleri onlar için ek meta veriler ekleyin böylece de nesneler vardır. bir ekleyerek ilgi çekici bir yöntemi işaretleri

Sınıf oluşturulduktan sonra sınıf dekoratör sonra tüm yöntemlerle gider ve işaretlenmiş bu yöntemleri konusunda ne gerekiyorsa yapar.

Eğer tüm yöntemleri etkilenen olmak istiyorsanız o zaman yöntem dekoratör dışarıda bırak ve sadece sınıf dekoratör kullanabilirsiniz.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Lena Danya

    Lena Danya

    11 NİSAN 2010
  • lilstevie89

    lilstevie89

    25 Mart 2011
  • metagamers

    metagamers

    13 Mayıs 2006