मैं वेब अनुप्रयोग के भीतर संसाधनों तक पहुंचने के तरीके (Google ऐप इंजन पर चलने) के तरीके को प्रबंधित करने के तरीके के प्रबंधन के लिए सजावटी का उपयोग करने की कोशिश कर रहा हूं। कृपया ध्यान दें कि मैं उपयोगकर्ताओं को अपने Google खातों से लॉग इन करने की अनुमति नहीं दे रहा हूं, इसलिए app.yaml के भीतर विशिष्ट मार्गों के विशिष्ट पहुंच अधिकार सेट करना एक विकल्प नहीं है। Bruce Eckel's guide to decorators
- - SO : get-class-in-python-decorator2
- SO : python-decorators-and-inheritance
- SO : get-class-in-python-decoratorपायथन सजावट और कक्षा विरासत
हालांकि मैं अभी भी एक सा उलझन में हूँ ...
यहाँ मेरी कोड है
:
मैं निम्नलिखित संसाधनों का इस्तेमाल किया! निम्न उदाहरण में, current_user एक @property विधि है जो RequestHandler क्लास से संबंधित है। यह डेटा स्तर पर संग्रहीत एक उपयोगकर्ता (डीबी.मोडेल) ऑब्जेक्ट देता है, जिसमें एक स्तर इंटप्रोपर्टी() होता है।
class FoobarController(RequestHandler):
# Access decorator
def requiredLevel(required_level):
def wrap(func):
def f(self, *args):
if self.current_user.level >= required_level:
func(self, *args)
else:
raise Exception('Insufficient level to access this resource')
return f
return wrap
@requiredLevel(100)
def get(self, someparameters):
#do stuff here...
@requiredLevel(200)
def post(self):
#do something else here...
हालांकि, मेरा आवेदन विभिन्न प्रकार के संसाधनों के लिए विभिन्न नियंत्रकों का उपयोग करता है। आदेश सभी उपवर्गों भीतर @requiredLevel डेकोरेटर का उपयोग करने में, मैं माता पिता के वर्ग (RequestHandler) पर ले जाते हैं की जरूरत है:
class RequestHandler(webapp.RequestHandler):
#Access decorator
def requiredLevel(required_level):
#See code above
मेरा विचार निम्नलिखित कोड का उपयोग कर सभी नियंत्रक उपवर्गों में डेकोरेटर का उपयोग करने की है:
class FoobarController(RequestHandler):
@RequestHandler.requiredLevel(100)
def get(self):
#do stuff here...
मुझे लगता है कि मैं सिर्फ सजावटी और कक्षा विरासत के बारे में अपने ज्ञान की सीमा तक पहुंच गया :)। कोई विचार ?
क्यों यह वर्ग पर एक विधि है? इससे चीजों को तोड़ने का कारण बन जाएगा, और यह केवल उस कक्षा के अंदर एक नियमित कार्य की तरह काम करेगा जो इसे परिभाषित किया गया था। जब तक कि आप 3.x पर न हों, इस मामले में यह शायद ठीक काम करेगा। –
सजावट कक्षा पर एक विधि है क्योंकि मुझे अभी तक यह नहीं पता है कि सजावटकर्ता को कक्षा 1 के रूप में कैसे कोड करना है/जो कि तर्क (ओं) को स्वीकार करता है और 2/जो वर्तमान वर्ग के तरीकों तक पहुंच सकता है। क्या यही आपका मतलब है ? ज्यादातर आत्म-सिखाए जाने के नाते, मुझे ब्रूस एकल की मार्गदर्शिका, सजावट करने वालों और विरासत को पूरी तरह से समझने में परेशानी हो रही है। – jbmusso
आप कक्षा के बाहर फ़ंक्शन को कॉपी-पेस्ट कर सकते हैं, और यह ठीक और सामान्य काम करेगा। क्या यह आपके प्रश्न का उत्तर देने के लिए पर्याप्त होगा? –