2011-05-11 13 views
43

निम्नलिखित कोड में, मैं एक मूल सार वर्ग Base बनाता हूं। संपत्ति प्रदान करने के लिए मुझे Base से प्राप्त सभी कक्षाएं चाहिए, इसलिए मैंने इस संपत्ति को @abstractmethod बनाया।पायथन सार कक्षाओं में अमूर्त गुण कैसे बनाएं

फिर मैंने Base का उप-वर्ग बनाया, जिसे Base_1 कहा जाता है, जिसका अर्थ कुछ कार्यक्षमता प्रदान करना है, लेकिन फिर भी सार बना रहता है। Base_1 में कोई name प्रॉपर्टी नहीं है, लेकिन फिर भी पाइथन बिना किसी त्रुटि के उस वर्ग के किसी ऑब्जेक्ट को इंस्टैटिनेट करता है। एक अमूर्त गुण कैसे बनाता है?

from abc import ABCMeta, abstractmethod 
class Base(object): 
    __metaclass__ = ABCMeta 
    def __init__(self, strDirConfig): 
     self.strDirConfig = strDirConfig 

    @abstractmethod 
    def _doStuff(self, signals): 
     pass 

    @property  
    @abstractmethod 
    def name(self): 
     #this property will be supplied by the inheriting classes 
     #individually 
     pass 


class Base_1(Base): 
    __metaclass__ = ABCMeta 
    # this class does not provide the name property, should raise an error 
    def __init__(self, strDirConfig): 
     super(Base_1, self).__init__(strDirConfig) 

    def _doStuff(self, signals): 
     print 'Base_1 does stuff' 


class C(Base_1): 
    @property 
    def name(self): 
     return 'class C' 


if __name__ == '__main__': 
    b1 = Base_1('abc') 
+0

पकड़ लिया: आप 'वर्ग C' में' डेकोरेटर का उपयोग करने के @ property' भूल जाते हैं, 'name' एक विधि पर लौट जाएगा। – kevinarpe

उत्तर

3

Python 3.3 के बाद से एक बग अर्थ property() डेकोरेटर तय किया गया था अब सही ढंग से सार के रूप में पहचान की है।

python docs से:

class C(ABC): 
    @property 
    @abstractmethod 
    def my_abstract_property(self): 
     ... 
34

तक Python 3.3, आप घोंसला @abstractmethod और @property नहीं कर सकता।

अमूर्त गुण बनाने के लिए @abstractproperty का उपयोग करें (docs)।

from abc import ABCMeta, abstractmethod, abstractproperty 

class Base(object): 
    # ... 
    @abstractproperty 
    def name(self): 
     pass 

कोड अब सही अपवाद को जन्म देती है: जब एक सार विधि के लिए आवेदन किया

 
Traceback (most recent call last): 
    File "foo.py", line 36, in 
    b1 = Base_1('abc') 
TypeError: Can't instantiate abstract class Base_1 with abstract methods name 
+28

वास्तव में यह जवाब युवा अजगरों के लिए गलत है: 3.3 के बाद से, 'अमूर्तप्रोपर्टी' को ओपी के संयोजन के पक्ष में बहिष्कृत किया गया है। –

+10

3.3 दस्तावेज़ों से: http://docs.python.org/3/library/abc.html#abc.abstractproperty – codeape

+0

धन्यवाद, कोडेप। मैं तदनुसार जवाब अपडेट करूंगा। –