2015-08-09 9 views
8

मैं एक वर्ग Node नामक एक importance सेटर और गेटर, नीचे दिए गए है कि है ओवरराइड: बाद मेंएक विरासत संपत्ति सेटर

class Node: 

    @property 
    def importance(self): 
     return self._importance 

    @importance.setter 
    def importance(self, new_importance): 
     if new_importance is not None: 
      new_importance = check_type_and_clean(new_importance, int) 
      assert new_importance >= 1 and new_importance <= 10 
     self._importance = new_importance 

, मैं एक वर्ग Theorem कि Node से विरासत है। Theorem और Node के बीच एकमात्र अंतर, जहां तक ​​importance संबंधित है, यह है कि Theorem में कम से कम 3 का importance होना चाहिए।

कैसे एक प्रमेय इनहेरिटimportance सेटर, लेकिन अतिरिक्त बाधा पर जोड़ सकते हैं कि importance >= 3?

मैं इसे इस तरह से करने की कोशिश की:

class Theorem(Node): 

    @importance.setter 
    def importance(self, new_importance): 
     self.importance = new_importance # hoping this would use the super() setter 
     assert self.importance >= 3 
+2

आप एक वर्ग विशेषता 'MIN_IMPORTANCE' वह यह है कि' 'Node' में 1' और' Theorem' में '3' होने से पूरी तरह से अलग तरह से समस्या का समाधान हो सकता है ध्यान दें। – jonrsharpe

+0

[अजगर में गुण ओवरराइड करना] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/7019643/overriding-properties-in-python) –

उत्तर

6

आप सीधे Node वर्ग के माध्यम से मौजूदा संपत्ति का उल्लेख कर सकते हैं, और यह से एक नया संपत्ति बनाने के लिए संपत्ति के setter विधि का उपयोग करें:

class Theorem(Node): 
    @Node.importance.setter 
    def importance(self, new_importance): 
     # You can change the order of these two lines: 
     assert new_importance >= 3 
     Node.importance.fset(self, new_importance) 

यह Theorem कक्षा में एक नई संपत्ति बनाएगा जो Node.importance से गेटर विधि का उपयोग करता है लेकिन सेटटर विधि को एक अलग से बदल देता है। इस तरह सामान्य कार्य में गुण: संपत्ति को setter पर कॉल करना एक कस्टम प्रेटर के साथ एक नई संपत्ति देता है, जो आमतौर पर पुरानी संपत्ति को प्रतिस्थापित करता है।

आप this answer (और सवाल भी) पढ़कर गुणों के काम के बारे में और जान सकते हैं।

+1

'लेखन त्रुटि: सेटर() वास्तव में एक तर्क (2 दिए गए)' लेता है। क्या आपका मतलब 'fset' था? – jonrsharpe

+0

@jonrsharpe अप्स, अभी आज़माएं: पी –

+1

हाँ, मेरे से बेहतर, और बेहतर! – jonrsharpe

3

एक तरह से यह करने के लिए Theorem पर एक नई प्रॉपर्टी को लागू करने Node गेटर का उपयोग कर, एक नया सेटर विधि प्रदान करने और Node सेटर स्पष्ट रूप से इसे भीतर फोन करके है: जहाँ तक

class Theorem(Node): 

    def _set_importance(self, new): 
     Node.importance.fset(self, new) 
     assert self.importance >= 3 

    importance = property(Node.importance.fget, _set_importance) 

के रूप में मुझे पता है कर रहा हूँ , यह super के साथ नहीं किया जा सकता है।


प्रति this bug report, तुम कर सकते हो:

class Theorem(Node): 

    def _set_importance(self, new): 
     super(Theorem, Theorem).importance.fset(self, new) 
     assert self.importance >= 3 

    importance = property(Node.importance.fget, _set_importance) 

बहरहाल, यह स्पष्ट रूप से एक सा अजीब है, super() को अनुमति देने के लिए पैच को पाइथन 3.5 के लिए निर्धारित किया गया है (September 2015 में)।

+0

'super .__ class__' को' super() 'पास न करें। जब आप 'थियोरम' से उप-वर्ग करेंगे तो यह पूरी तरह से टूट जाएगा। – Kevin

+0

@ केविन क्या करेंगे? एक त्वरित परीक्षण से संकेत मिलता है कि यह 'थियोरम' सबक्लास उदाहरण से 'Node.importance.fset' तक पहुंच रहा है। – jonrsharpe

+0

ISTM कि 'सुपर (थियोरम सब्सक्रास, थियोरम सब्सक्रास)। महत्व' आपके द्वारा बनाई गई वस्तु को अंतिम पंक्ति पर वापस कर देगा। एक बार जब आप 'fset() 'कॉल करते हैं तो उसे अनंत रिकर्सन का उत्पादन करना चाहिए। – Kevin

1

यहाँ व्यापक समस्या के लिए एक पूरी तरह से अलग समाधान, चारों ओर बहुत कम faffing साथ है:

class Node: 

    MIN_IMPORTANCE = 1 
    MAX_IMPORTANCE = 10 

    @property 
    def importance(self): 
     return self._importance 

    @importance.setter 
    def importance(self, new_importance): 
     if new_importance is not None: 
      new_importance = check_type_and_clean(new_importance, int) 
      assert (new_importance >= self.MIN_IMPORTANCE and 
        new_importance <= self.MAX_IMPORTANCE) 
     self._importance = new_importance 


class Theorem(Node): 

    MIN_IMPORTANCE = 3 

    # and that's all it takes! 
मेरे मन के लिए

, इस व्यक्त करता है:

The only difference between a Theorem and a Node , as far as importance is concerned, is that a Theorem must have an importance of at least 3 .

एक बहुत अधिक स्पष्ट रूप से अधिभावी से संपत्ति सेटटर करता है।


ध्यान दें कि assert आम तौर पर चीजें हैं जो आप उम्मीद भी हो सकता है के लिए नहीं, परीक्षण और डीबगिंग के लिए प्रयोग किया जाता है बल्कि सामान्य कार्यक्रम प्रवाह के हिस्से के रूप से, और निश्चित रूप से; उदाहरण देखें Best practice for Python Assert

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