2011-10-20 12 views
13

मैं एक विरासत वर्ग में ओवरराइडिंग विधि की बजाय एक ही कक्षा में एक और विधि को कॉल करने के लिए बेस क्लास में एक विधि चाहूंगा। मैं निम्नलिखित कोड बाहरविरासत और बेस क्लास विधि कॉल पायथन

कक्षा बी प्रिंट करना चाहते हैं: 6

क्लास ए: 9

यह किया जा सकता है? http://docs.python.org/tutorial/classes.html#private-variables और http://docs.python.org/reference/expressions.html#atom-identifiers पर:


# Base class definition 
class ClassA(object): 
    def __init__(self): 
     print("Initializing A") 

    # hoping that this function is called by this class's printFnX 
    def fnX(self, x): 
     return x**2 

    def printFnX(self, x): 
     print("ClassA:",self.fnX(x)) 

# Inherits from ClassA above 
class ClassB(ClassA): 
    def __init__(self): 
     print("initizlizing B") 

    def fnX(self, x): 
     return 2*x 

    def printFnX(self, x): 
     print("ClassB:", self.fnX(x)) 
     ClassA.printFnX(self,x) 

bx = ClassB() 
bx.printFnX(3) 
+10

क्या आप इस बात पर पुनर्विचार करने की परवाह करते हैं कि आपने किस उत्तर को स्वीकार किया है? वर्तमान चयन ज्यादातर लोगों और अधिकतर मामलों के लिए वास्तव में खराब सलाह है। –

उत्तर

-3

यह दोनों कक्षाओं के fnX और printFnX बनाकर हासिल किया जा सकता है।

class ClassA(object): 

    def __init__(self): 
     print("Initializing A") 

    # hoping that this function is called by this class's printFnX 
    @classmethod 
    def fnX(self, x): 
     return x ** 2 

    @classmethod 
    def printFnX(self, x): 
     print("ClassA:",self.fnX(x)) 

class ClassB(ClassA): 
    def __init__(self): 
     print("initizlizing B") 

    def fnX(self, x): 
     return 2*x 

    def printFnX(self, x): 
     print("ClassB:", self.fnX(x)) 
     ClassA.printFnX(x) 


bx = ClassB()<br> 
bx.printFnX(3) 
+0

यह अन्य उत्तर से बेहतर है ... अधिक सुरुचिपूर्ण। धन्यवाद। – fodon

+5

यह भी काम नहीं करता है। एक इंस्टेंस वैरिएबल तक पहुंचने का प्रयास करें जैसे कि 'f.X' से 'self.y'''। एक वर्ग विधि में, * स्वयं * परिवर्तनीय अब उदाहरण धारण नहीं करता है; इसके बजाय, यह कॉलर के उदाहरण का वर्ग बन जाता है, इसलिए आपने इंस्टेंस चरों तक पूरी तरह से खो दिया है। यह "पैटर्न" एक आपदा है और ऐसा कुछ है जिसका उपयोग उस कोड में नहीं किया जाना चाहिए जिसकी आप परवाह करते हैं। –

+0

मैं मानता हूं, उसने अभी अपने मूल प्रश्न का उत्तर दिया है, यह आपके द्वारा अभी वर्णित सभी दोषों के साथ है। यहां प्रति पैटर्न नहीं है। –

49

बधाई हो, आप अजगर की दोहरी-अंडरस्कोर नाम mangling :-)

विवरण और एक काम से बाहर उदाहरण देखने के लिए के लिए प्रेरित उपयोग के मामले की खोज की है।

यहां अपने उदाहरण के लिए इसका इस्तेमाल करने की है:

# Base class definition 
class ClassA(object): 
    def __init__(self): 
     print("Initializing A") 

    # hoping that this function is called by this class's printFnX 
    def fnX(self, x): 
     return x**2 
    __fnX = fnX 

    def printFnX(self, x): 
     print("ClassA:",self.__fnX(x)) 

# Inherits from ClassA above 
class ClassB(ClassA): 
    def __init__(self): 
     print("initizlizing B") 

    def fnX(self, x): 
     return 2*x 

    def printFnX(self, x): 
     print("ClassB:", self.fnX(x)) 
     ClassA.printFnX(self,x) 

bx = ClassB() 
bx.printFnX(3) 

उपयोग के मामले में "उपवर्गीकरण की कला" http://www.youtube.com/watch?v=yrboy25WKGo&noredirect=1 में पाया Open-Closed Principle को लागू करने के तरीके के रूप में वर्णित है।

+1

बहुत अंतर्दृष्टि। अब मुझे पता है कि तरीकों के डबल-अंडरस्कोर नामकरण के लिए उपयोगी क्या है! –

+0

क्या स्पष्ट नहीं हो सकता है कि बेस क्लास में विधियां सार्वजनिक होंगी या आपको पूरी तरह से उलझन वाले नाम का उपयोग करना होगा। पायथन में "संरक्षित" या "मित्र" क्वालीफायर नहीं है, इसलिए जब सुपर क्लास से बेस क्लास तक 'def __do कुछ (स्वयं):' चलती है, तो इसे सुपर क्लास से एक्सेस नहीं किया जाएगा। आपको या तो इसे सार्वजनिक करना होगा 'def do कुछ (स्वयं):' या उलझन वाले नाम का उपयोग करें। –

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