2010-03-23 15 views
9

मैं कक्षा विशेष विधि को कैसे ओवरराइड कर सकता हूं?पायथन ओवरराइडिंग क्लास (उदाहरण नहीं) विशेष तरीके

मैं उदाहरण के बिना कक्षा के __str__() विधि को कॉल करने में सक्षम होना चाहता हूं। उदाहरण:

class Foo: 
    def __str__(self): 
     return 'Bar' 

class StaticFoo: 
    @staticmethod 
    def __str__(): 
     return 'StaticBar' 

class ClassFoo: 
    @classmethod 
    def __str__(cls): 
     return 'ClassBar' 

if __name__ == '__main__': 
    print(Foo) 
    print(Foo()) 
    print(StaticFoo) 
    print(StaticFoo()) 
    print(ClassFoo) 
    print(ClassFoo()) 

पैदा करता है:

<class '__main__.Foo'> 
Bar 
<class '__main__.StaticFoo'> 
StaticBar 
<class '__main__.ClassFoo'> 
ClassBar 

होना चाहिए:

Bar 
Bar 
StaticBar 
StaticBar 
ClassBar 
ClassBar 

यहां तक ​​कि अगर मैं @staticmethod या @classmethod__str__ अभी भी उपयोग कर रहा है का उपयोग करने के लिए अंतर्निहित अजगर परिभाषा __str__। यह केवल तभी काम कर रहा है जब Foo().__str__()Foo.__str__() के बजाय।

+0

-1: "उदाहरण बनाकर बिना' __str __() 'वर्ग की विधि कहते हैं"। किसी भी वस्तु के बारे में हर समझ को तोड़ता है। कृपया ऐसा मत करो। यह कार्यक्रम पूरी तरह से हमारी सबसे मौलिक उम्मीदों का उल्लंघन करता है। –

+5

मैं असहमत हूं। यदि आप str (MyClass) को कॉल करते हैं तो ऐसा कोई कारण नहीं है कि आप इसे व्यवहार करने की अपेक्षा करें जैसे कि आपको str (myClassObject) कहा जाता है। यही है, शुरू करने के लिए कोई मौलिक उम्मीद नहीं है। मुझे संदेह है कि वह एक स्थिर वर्ग बनाना चाहता है और इसका कोई भी उदाहरण बनाने का इरादा नहीं रखता है। –

उत्तर

17

विशेष विधि __str__ कक्षा में परिभाषित विशेष रूप से उस वर्ग के उदाहरणों के लिए काम करता है, कक्षा वर्गों के लिए अलग-अलग व्यवहार करने के लिए आपको उस वर्ग के मेटाक्लास में ऐसा करना होगा। (अजगर 2,5)

class Meta(type): 
    def __str__(self): 
     return "Klass" 

class A(object): 
    __metaclass__ = Meta 

    def __str__(self): 
     return "instance" 

print A 
print A() 

उत्पादन:

Klass 
instance 
+1

मुझे कक्षा सी (मेटाक्लास = एम) के नए py3 वाक्यविन्यास का उपयोग करना पड़ा: ... लेकिन यह काम करता है! –

1

तुम क्यों __str__ के अर्थ का दुरुपयोग करना चाहते हैं? यह विधि अर्थ के लिए आरक्षित है "इस उदाहरण" की स्ट्रिंग प्रस्तुति वापस करें।

यदि आप एक ऐसा फ़ंक्शन चाहते हैं जो केवल स्थिर स्ट्रिंग लौटाता है, तो यह बेहतर होगा कि एक वर्ग के भीतर एक अलग फ़ंक्शन न हो।

यदि आप एक कन्स्ट्रक्टर चाहते हैं जो एक नई स्ट्रिंग देता है, तो इसे कुछ और नाम दें ताकि यह आरक्षित __str__ नाम को क्लॉबर नहीं कर रहा हो।

0

मुझे यकीन है कि आप क्या करने की कोशिश कर रहे हैं, वास्तव में नहीं हूँ। मुझे बस कुछ यादृच्छिक जानकारी जोड़ें।

सबसे पहले, इस वर्ग को जोड़ने:

class FooNew(object): 
def __str__(self): 
    return 'Fubar' 

प्रिंट इस बजाय:

You are calling type for an old style class 
__main__.Foo 
<class __main__.Foo at 0xb73c9f5c> 
Bar 
But my Python 2.6 didn't match your output for print(Foo) 
You are calling object.str() for a new style class 
<class '__main__.FooNew'> 
<class '__main__.FooNew'> 
Fubar 
Why do you want to change this? 

आप पूरी तरह सुनिश्चित करें कि आप नहीं कॉल करने के लिए चाहते हैं:

if __name__ == '__main__': 
    print "You are calling type for an old style class" 
    print(Foo) 
    print(type.__str__(Foo)) 
    print(Foo()) 
    print("But my Python 2.6 didn't match your output for print(Foo)") 
    print("You are calling object.str() for a new style class") 
    print(FooNew) 
    print(object.__str__(FooNew)) 
    print(FooNew()) 
    print("Why do you want to change this?") 

इस प्राप्त करने के लिए एक वर्ग विधि?

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