2012-06-05 28 views
5

से पहले स्थिति की जांच करें मेरे पास सर्वर नामक एक क्लास है जिसे प्रारंभ और बंद किया जा सकता है। कुछ तरीकों को तब तक नहीं बुलाया जाना चाहिए जब तक कि सर्वर प्रारंभ नहीं होता है, इस स्थिति में एक नॉनकनेक्टेड अपवाद उठाया जाना चाहिए। कक्षा में प्रत्येक विधि से पहले एक विधि को कॉल करने का कोई तरीका है और यह निर्धारित करता है कि क्लास वेरिएबल _started सही पर सेट है या नहीं?विधि कॉल

मैंने एक सजावटी का उपयोग करने की कोशिश की, लेकिन सजावटी फ़ंक्शन को कक्षा चर तक पहुंच नहीं है। मैं इस तरह कुछ करने के लिए कोशिश कर रहा था:

class Server(object): 
    _started = False 
    def started(self): 
     if(self._started == False): 
      raise NotConnectedException 

    @started 
    def doServerAction(self): 
     ... 
+0

क्या आपने सजावट को कक्षा में सीधे डालने का प्रयास किया था? मैंने यह जानने के लिए सजावटी पर पर्याप्त काम नहीं किया है कि यह कितना अच्छा काम करेगा, लेकिन यह वह जगह है जहां मैं – inspectorG4dget

+0

को इस [पोस्ट] के रूप में देखना शुरू कर दूंगा (http://stackoverflow.com/questions/2366713/can-a-python-decorator- ऑफ-ए-इवेंट-विधि-एक्सेस-द-क्लास) ने कहा, यदि यह python2.6 या बाद में है, तो आपके सजावटी के लिए क्लास वेरिएबल – xvatar

+0

@ इंस्पेक्टर G4dget हां तक ​​पहुंचने का एक तरीका है, सजावट कक्षा में है। – BlueVoid

उत्तर

8

याद रखें क्या सज्जाकार हैं:

def foo(...): 
    ... 
foo = decorate(foo) 

डेकोरेटर समारोह पर कहा जाता है:

@decorate 
def foo(...): 
    ... 

बिल्कुल के बराबर है, इसलिए पहले पैरामीटर को कॉल करना स्वयं कोई नहीं बनाता समझ। इसके अलावा, जब इसे परिभाषित किया जाता है तो सजावटी को फ़ंक्शन पर बुलाया जाता है, और जो कुछ भी लौटाता है वह फ़ंक्शन के स्थान पर उपयोग किया जाता है। तो अगर आपके started सजावट ने _started फ़ंक्शन की विशेषता तक पहुंचने का प्रयास करके AttributeError फेंक नहीं दिया है, तो यह None लौटाएगा, जिससे आपकी सभी विधियां None पर सेट हो जाएंगी, और इस प्रकार कॉल करने योग्य भी नहीं होगी।

क्या आप चाहते हैं कुछ इस तरह है:

import functools 

def started(func): 
    @functools.wraps(func) 
    def wrapper(self, *args, **kwargs): 
     if not self._started: 
      raise ... 
     else: 
      return func(self, *args, **kwargs) 
    return wrapper 

लगभग सभी सज्जाकार इस फार्म के होते हैं; वे एक समारोह लेते हैं, एक रैपर बनाते हैं जो प्राप्त कार्य के आसपास "आसपास" कुछ करता है, और फिर रैपर को वापस कर देता है। functools.wraps का उपयोग यहां एक सुविधा है यदि आप कभी भी इस कोड के साथ एक इंटरैक्टिव दुभाषिया सत्र में काम करना समाप्त कर देते हैं; यह स्वचालित रूप से wrapper फ़ंक्शन को मूल फ़ंक्शन के नाम और डॉकस्ट्रिंग के साथ अद्यतन करता है, जो सजाए गए कार्यों को मूल कार्य को "थोड़ा" जैसा दिखता है।

यह अप्रासंगिक है कि यह कक्षा के अंदर परिभाषित किया गया है या नहीं।

+0

यह वही है जो मैं ढूंढ रहा था। धन्यवाद! – BlueVoid

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