2017-01-29 19 views
6

नहीं है मैं इस कोड है: जब मैं इस चलाने मैं त्रुटि मिलती रहती है'staticmethod' ऑब्जेक्ट प्रतिदेय स्विच/मामले

class A(object): 
    @staticmethod 
    def open(): 
     return 123 
    @staticmethod 
    def proccess(): 
     return 456 


    switch = { 
     1: open, 
     2: proccess, 
     } 
obj = A.switch[1]() 

:

TypeError: 'staticmethod' object is not callable 

कि यह कैसे हल करने के लिए?


+0

http://stackoverflow.com/questions/3798835/understanding-get-and-set-and-python-descriptors –

+0

['classmethod' ऑब्जेक्ट का संभावित डुप्लिकेट कॉल करने योग्य नहीं है] (http://stackoverflow.com/ प्रश्न/11058686/classmethod-object-is-not-callable) – melpomene

+0

@melpomene: ओह, मुझे यकीन नहीं है कि मुझे यह क्यों याद आया। –

उत्तर

11

आप एक शब्दकोश में अनबाउंडstaticmethod वस्तुओं भंडारण कर रहे हैं। इस तरह की वस्तुओं (साथ ही classmethod ऑब्जेक्ट्स, फ़ंक्शंस और property ऑब्जेक्ट्स) केवल कक्षा या उदाहरण पर एक विशेषता के रूप में नाम तक पहुंचकर descriptor protocol के माध्यम से बाध्य हैं। कक्षा निकाय में staticmethod ऑब्जेक्ट्स को सीधे एक्सेस करना एक विशेषता पहुंच नहीं है।

या तो (ताकि आप उन्हें विशेषताओं के रूप में का उपयोग) वर्ग बनाने के बाद शब्दकोश बनाने के लिए, या स्पष्ट रूप से बाध्य है, या उन्हें शब्दकोश में भंडारण से पहले मूल कार्य निकालें।

ध्यान दें कि staticmethod वस्तुओं के लिए 'बाध्यकारी' केवल इसका अर्थ है कि संदर्भ केवल अनदेखा किया जाता है; एक बाध्य staticmethod अंतर्निहित कार्य अपरिवर्तित लौटाता है।

तो अपने विकल्पों शब्दकोश अनइंडेंट और विशेषताओं का उपयोग करके वर्णनकर्ता प्रोटोकॉल को गति प्रदान करने हैं:

class A(object): 
    @staticmethod 
    def open(): 
     return 123 
    @staticmethod 
    def proccess(): 
     return 456 

A.switch = { 
    1: A.open, 
    2: A.proccess, 
} 

या स्पष्ट रूप से बाध्य करने के लिए, एक डमी संदर्भ में गुजर (जो वैसे भी नजरअंदाज कर दिया जाएगा):

class A(object): 
    @staticmethod 
    def open(): 
     return 123 
    @staticmethod 
    def proccess(): 
     return 456 

    switch = { 
     1: open.__get__(object), 
     2: proccess.__get__(object), 
    } 

या __func__ विशेषता के साथ सीधे अंतर्निहित समारोह का उपयोग:

class A(object): 
    @staticmethod 
    def open(): 
     return 123 
    @staticmethod 
    def proccess(): 
     return 456 

    switch = { 
     1: open.__func__, 
     2: proccess.__func__, 
    } 

हालांकि, यदि आप जो करने की कोशिश कर रहे हैं, तो नामस्थान फ़ंक्शंस के समूह के लिए प्रदान करना है, तो आपको पहले स्थान पर क्लास ऑब्जेक्ट का उपयोग नहीं करना चाहिए। कार्यों को मॉड्यूल में रखें। इस तरह आपको पहले स्थान पर staticmethod सजावट का उपयोग करने की आवश्यकता नहीं है और उन्हें फिर से खोलना नहीं है।

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