2011-10-06 12 views
5

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

मेरे डेकोरेटर:

def specialTest(fn): 
    filename = fn.__name__ 
    directory = fn.__module__ 
    subdirectory = fn.__class__.__name__ #WHERE DO I GET THIS 
+0

fn.im_class .__ name__ – janoliver

+0

सजावटी में एक विशेष तर्क देते हुए कहते हैं कि 'is_member_func' है, अगर यह सच है तो पहला तर्क जो स्वयं है। –

उत्तर

8

तो fn एक instancemethod है, तो आप fn.im_class उपयोग कर सकते हैं।

 
>>> class Foo(object): 
...  def bar(self): 
...   pass 
... 
>>> Foo.bar.im_class 
__main__.Foo 

ध्यान दें कि यह एक डेकोरेटर से नहीं काम करते हैं, क्योंकि एक समारोह केवल के बाद एक उदाहरण विधि में तब्दील हो जाता वर्ग परिभाषित किया गया है जाएगा (यानी, अगर @specialTestbar को सजाने के लिए इस्तेमाल किया गया था, ऐसा नहीं है काम; यदि यह भी संभव है, तो उस बिंदु पर इसे कॉल स्टैक या कुछ समान रूप से नाखुश निरीक्षण करके किया जाना चाहिए)।

+0

यही वह था जिसे मैं डरता था। धन्यवाद। –

+0

किसी कारण से यह तब तक पंजीकृत नहीं हुआ जब तक कि मैं कोड में वापस नहीं जाता। यह संभव है, मुझे बस अपना कोड ले जाना है जो लपेटा हुआ फ़ंक्शन के अंदर एफएन के साथ इंटरैक्ट करता है, जहां एफएन एक उदाहरण है। –

+0

परिभाषा समय पर यह संभव नहीं है, हालांकि आप वर्ग के निर्माण के बाद सजाए गए कार्यों को सूचीबद्ध कर सकते हैं: इसे प्राप्त करने के लिए, सजावटी को – kolypto

6

पायथन 2 में आप विधि वस्तु पर im_class विशेषता का उपयोग कर सकते हैं। पायथन 3 में, यह __self__.__class__ (या type(method.__self__)) होगा।

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