2011-10-27 3 views
24

उदाहरण के लिए:क्या मैं नामांकित के स्ट्रिंग फॉर्म को ओवरराइट कर सकता हूं?

>>> Spoken = namedtuple("Spoken", ["loudness", "pitch"]) 
>>> s = Spoken(loudness=90, pitch='high') 
>>> str(s) 
"Spoken(loudness=90, pitch='high')" 

क्या मैं चाहता हूँ है:

>>> str(s) 
90 

है कि मैं स्ट्रिंग प्रतिनिधित्व प्रबलता विशेषता प्रदर्शित करना चाहते हैं। क्या यह संभव है? __str__ को

def print_loudness(self): 
    return str(self.loudness) 

और आवंटित यह:

+1

शायद आपको इसके बजाय उचित पुन: प्रयोज्य वर्ग बनाना चाहिए। जिज्ञासा से – Oliver

उत्तर

42

हाँ, यह करने के लिए कठिन नहीं है और एक उदाहरण namedtuple docs में इसके लिए नहीं है ।

>>> from collections import namedtuple 
>>> class Spoken(namedtuple("Spoken", ["loudness", "pitch"])): 
     __slots__ =() 
     def __str__(self): 
      return str(self.loudness) 

>>> s = Spoken(loudness=90, pitch='high') 
>>> str(s) 
'90' 
+9

यहां '__slots__' उपयोग क्या है? क्या यह आवश्यक या वैकल्पिक है? – clwen

+14

एक खाली टुपल में '' __slots__'' सेट करना एक स्मृति बचत तकनीक है। यह सुनिश्चित करता है कि 'स्पोकन' के उदाहरण नियमित ट्यूपल के समान स्मृति लेते हैं। स्लॉट प्रविष्टि के बिना, प्रत्येक उदाहरण के लिए अपने स्वयं के शब्दकोश की आवश्यकता होती है (जो एक ट्यूपल से बहुत बड़ा है)। –

9

आप इसके लिए एक समारोह को परिभाषित कर सकते

Spoken.__str__ = print_loudness 
+1

, क्या यह एक 'पूर्णांक' या 'स्ट्रिंग' वापस करेगा, क्योंकि आपका अधिभारित 'str'' int' लौटा रहा है? – Serdalis

+1

@ सेरडलिस: अच्छी तरह से देखा गया, यह गलत रूप से 'पूर्णांक' वापस कर देगा। इसे ठीक कर रहा है। –

+0

मुझे इस तरह से पसंद है, क्योंकि यह '' nametuple'' का उपयोग करने के डिफ़ॉल्ट तरीके से थोड़ा टेक्स्ट जोड़ता है। आप इसे अधिक पठनीयता (आईएमएचओ) खोए बिना लैम्ब्डा अभिव्यक्ति का उपयोग करके इसे छोटा कर सकते हैं: ''स्पोकन .__ str__ = lambda x: str (x.loudness)' '। (बेशक आप लैम्ब्डा अभिव्यक्ति के अंदर [''% '' या '' str.format (...) ''] (http://stackoverflow.com/q/5082452) का उपयोग कर सकते हैं)। – djlauk

4

आप इस तरह कोड का उपयोग कर सकते हैं::

तकनीक एक उपवर्ग है कि अपनी ही str विधि कहते हैं बनाने के लिए है

from collections import namedtuple 

class SpokenTuple(namedtuple("Spoken", ["loudness", "pitch"])): 

    def __str__(self): 
     return str(self.loudness) 

s = SpokenTuple(loudness=90, pitch='high') 

print(str(s)) 

यह अपनी पसंद का एक वर्ग में namedtuple लपेटो जाएगा जो फिर आप स्ट्र फ़ंक्शन को ओवरलोड भी करते हैं।

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

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