2010-01-01 13 views
25

Neden decorator bir staticmethod veya classmethod'u süslemez?@decorator neden bir staticmethod veya bir classmethod süslemez?

from decorator import decorator 

@decorator 
def print_function_name(function, *args): 
    print '%s was called.' % function.func_name 
    return function(*args) 

class My_class(object): 
    @print_function_name 
    @classmethod 
    def get_dir(cls): 
     return dir(cls) 

    @print_function_name 
    @staticmethod 
    def get_a(): 
     return 'a' 
Hem get_dir

ve AttributeError: <'classmethod' or 'staticmethod'>, object has no attribute '__name__' içinde get_a sonuç.

func_name özniteliği yerine __name__ özniteliğinde decorator neden bağımlıdır? (Aqaik sınıf yöntemleri ve staticmethods dahil tüm işlevler func_name özniteliğine sahiptir.)

Düzenleme: Python 2.6 kullanıyorum.

+1

Neden aradığınız fonksiyonu (* args): Bunun gibi

? Bu iş sadece bir işlevi döndürmektir (sizin durumunuzda, değiştirilmemiş). – gahooa

+4

gahooa: Bu bir şekilde 'dekoratör' (dil yapısını değil, içe aktardığı) çalışır, bkz. Http://pypi.python.org/pypi/decorator. –

+0

@taldor 2.6'da dekoratör modülünüz var mı? – mykhal

cevap

22

Çalışıyor. Çoğu dekoratörler, tanımlayıcıları kabul etmek için tasarlanmamıştır.

Normal olarak, birden çok dekoratör kullanıldığında, en son olarak classmethod ve staticmethod'u uygulamanız gerekir. Dekoratörler "aşağıdan yukarı" düzende uygulandığından, normal olarak classmethod ve staticmethod kaynakta en üstte yer almalıdır. dekoratör İÇİNDEKİ

class My_class(object): 
    @classmethod 
    @print_function_name 
    def get_dir(cls): 
     return dir(cls) 

    @staticmethod 
    @print_function_name 
    def get_a(): 
     return 'a' 
+7

bir dekoratör modülü yoktur, bir kural olarak, 'classmethod' ve "staticmethod" özel bir sihir türü uygular ve en son çağrılmalıdır. Soruya cevap vermek için –

3

İstediğiniz bu mu?

from decorator import decorator 

@decorator 
def print_function_name(function, *args): 
    print '%s was called.' % function.func_name 
    return function(*args) 

class My_class(object): 
    @classmethod 
    @print_function_name 
    def get_dir(cls): 
     return dir(cls) 
    @staticmethod 
    @print_function_name 
    def get_a(): 
     return 'a' 
+2

Anladığınızdan emin değilim, ama kullandığı "dekoratör" paketi "sarıcı" ile yapı ile aynı şeyi yapıyor. Parçacıklarınız arasındaki tek fark, Dekoratörlerin My_class uygulamasında uygulanmasıdır. Cevabın neden bir şeyi düzelttiğini açıklamak için açıklığa kavuşabilirsiniz. –

+0

Düzeltme için teşekkürler. Ben dekoratör modülün eksik olduğu py3k içinde sorun ile oynuyordum. Ben hızlı bir cevap benim, ve birilerinin ayrıntılı açıklama – mykhal

+0

@ (Peter Hansen) ile daha iyi bir cevap yayınlayacağından emin oldum .. Ancak, python 2.6 ya da – mykhal

37

classmethod ve staticmethod dönüş descriptor objects değil, işlevleri: @classmathod ve @staticmethod en üstteki dekoratörler olduğunda

def print_function_name(function): 
    def wrapper(*args): 
     print('%s was called.' % function.__name__) 
     return function(*args) 
    return wrapper 

class My_class(object): 
    @classmethod 
    @print_function_name 
    def get_dir(cls): 
     return dir(cls) 

    @staticmethod 
    @print_function_name 
    def get_a(): 
     return 'a' 
+7

+1 ("neden ...?"). –

İlgili konular