2010-01-31 15 views
8

निम्नलिखित कुछ कारण के लिए काम नहीं करता:क्या Python में कक्षा संपत्ति बनाने का कोई तरीका है?

>>> class foo(object): 
...  @property 
...  @classmethod 
...  def bar(cls): 
...    return "asdf" 
... 
>>> foo.bar 
<property object at 0x1da8d0> 
>>> foo.bar + '\n' 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unsupported operand type(s) for +: 'property' and 'str' 

वहाँ यह करने के लिए एक रास्ता है, या मेरे ही metaclass प्रवंचना किसी तरह का सहारा लेना विकल्प है?

+1

किसी के लिए पाइथन में 'गुण' से अपरिचित किसी के लिए शायद यह समझने में आपकी सहायता करेगा कि जेसन http://docs.python.org/library/functions.html#property – MatrixFrog

उत्तर

6

यदि आप ऑब्जेक्ट एक्स से विशेषता प्राप्त करते समय ट्रिगर करने के लिए वर्णक property चाहते हैं, तो आपको वर्णनकर्ता को type(X) में रखना होगा। तो यदि एक्स एक वर्ग है, तो वर्णनकर्ता वर्ग के प्रकार में जाना चाहिए, जिसे वर्ग के मेटाक्लास के रूप में भी जाना जाता है - कोई "चालबाजी" शामिल नहीं है, यह केवल पूरी तरह से सामान्य नियमों का मामला है।

वैकल्पिक रूप से, आप अपना खुद का विशेष उद्देश्य वर्णनकर्ता लिख ​​सकते हैं। वर्णनकर्ताओं पर उत्कृष्ट "कैसे-कैसे" संधि के लिए here देखें। उदाहरण के लिए संपादित:

class classprop(object): 
    def __init__(self, f): 
    self.f = classmethod(f) 
    def __get__(self, *a): 
    return self.f.__get__(*a)() 

class buh(object): 
    @classprop 
    def bah(cls): return 23 

print buh.bah 

का उत्सर्जन करता है 23, के रूप में वांछित।

+0

के बारे में क्या बात कर रहा है, मैं कहीं और मेटाक्लास का उपयोग कर रहा हूं विरासत पदानुक्रम, इसलिए यदि मैं मेटाक्लास का उपयोग करता हूं, तो मुझे निम्न मिलता है: 'मेटाक्लास संघर्ष: व्युत्पन्न वर्ग का मेटाक्लास अपने सभी अड्डों के मेटाक्लास के एक (गैर-सख्त) उप-वर्ग होना चाहिए' –

+0

* हालांकि *, सजावटी ने काम किया जादू की तरह। धन्यवाद! –

+0

@ जेसन, आप सभी शामिल मेटाक्लासों के उप-वर्ग का भी उपयोग कर सकते हैं, क्योंकि त्रुटि संदेश कहता है (कुछ एकाधिक कस्टम मेटाक्लास, या मेटाक्लास का उपयोग करते हैं जो 'टाइप' उप-वर्ग नहीं करते हैं, इसलिए शायद आपको केवल एक कस्टम मेटाक्लास को उपclass करना होगा 'उपयोग कर रहे हैं) - लेकिन यदि कस्टम डिस्क्रिप्टर नौकरी करता है, तो यह वास्तव में एक आसान दृष्टिकोण हो सकता है। –

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