2010-01-01 6 views
25

decorator क्यों एक staticmethod या एक classmethod सजाने नहीं कर सकते हैं?@ डिकोरेटर एक staticmethod या classmethod क्यों सजाने नहीं कर सकता है?

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' 

दोनों get_dir और AttributeError: <'classmethod' or 'staticmethod'>, object has no attribute '__name__' में get_a परिणाम।

विशेषता func_name विशेषता के बजाय __name__ विशेषता पर decorator क्यों निर्भर करता है? (क्लासिक विधिओं और staticmethods सहित सभी कार्यों, func_name विशेषता है।)

संपादित करें: मैं पायथन 2.6 का उपयोग कर रहा हूं।

+1

तुम क्यों बुला रहे हैं समारोह (* args) डेकोरेटर अंदर:

इस तरह

? यह काम केवल एक समारोह (अपने मामले में, unmodified) वापस करने के लिए है। – gahooa

+4

गहुआ: क्योंकि यह एक तरीका है 'सजावट' (वह जो आयात करता है, भाषा निर्माण नहीं करता) काम करता है, http://pypi.python.org/pypi/decorator देखें। –

+0

@taldor आपके पास py 2.6 में सजावटी मॉड्यूल है? – mykhal

उत्तर

22

यह काम करता है जब @classmathod और @staticmethod सर्वोच्च सज्जाकार हैं:

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' 
+7

नियम के रूप में, 'classmethod' और 'staticmethod' एक विशेष प्रकार का जादू लागू करता है और उसे अंतिम कहा जाना चाहिए। वास्तव में प्रश्न का उत्तर देने के लिए –

3

क्या यह आप चाहते थे?

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' 
+2

मुझे यकीन नहीं है कि आपको एहसास हुआ है, लेकिन वह "सजावटी" पैकेज जिसका उपयोग कर रहा है वह "रैपर" के साथ निर्माण जैसा ही काम करता है। अपने स्निपेट के बीच एकमात्र अंतर My_class में सजावट लगाने का आदेश है। आप स्पष्ट कर सकते हैं कि यह समझाने के जवाब में कि यह चीजों को ठीक क्यों करता है। –

+0

सुधार के लिए धन्यवाद। मैं py3k में समस्या के साथ खेल रहा था, जहां सजावट मॉड्यूल गुम है। मेरा मतलब था कि मेरा जवाब त्वरित होगा, और यह सुनिश्चित था कि कोई विस्तृत विवरण – mykhal

+0

@ (पीटर हंसन) के साथ बेहतर उत्तर पोस्ट करेगा .. हालांकि, पाइथन 2.6 में कोई सजावटी मॉड्यूल नहीं है या तो – mykhal

37

classmethod और staticmethod वापसी descriptor objects, नहीं काम करता है। अधिकांश सजावटी डिस्क्रिप्टर स्वीकार करने के लिए डिज़ाइन नहीं किए गए हैं।

आम तौर पर, आपको कई सजावट का उपयोग करते समय classmethod और staticmethod लागू करना होगा। और चूंकि सजावटी "नीचे ऊपर" क्रम में लागू होते हैं, classmethod और staticmethod सामान्य रूप से आपके स्रोत में सबसे अधिक होना चाहिए।

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 ("क्यों ...?")। –

संबंधित मुद्दे