2011-10-20 11 views
13

基本クラスのメソッドが、継承されたクラスのオーバーライドメソッドではなく、同じクラスの別のメソッドを呼び出すようにしたいと思います。 私は継承と基本クラスメソッドの呼び出しpython

クラスBをプリントアウトするために、次のコードたい:6

クラスA:9

はこれが行うことができますか?


# 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

両方のクラスメソッドを作成することによっても同じことが達成できます。

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

これは機能しません。 fnXの中から '' self.y''のようなインスタンス変数にアクセスしてみてください。クラスメソッドでは、* self *変数はもはやインスタンスを保持しません。代わりに、呼び出し元のインスタンスのクラスになります。したがって、インスタンス変数へのアクセスが完全に失われてしまいます。この "パターン"は災害であり、あなたが心配しているコードでは使用すべきではありません。 –

+0

私は同意する、それはちょうど彼の元の質問に答えた、それはあなたが今説明したすべての欠点とそれです。ここにパターンはありません。 –

49

おめでとう、あなたは、詳細については:-)

をマングリングPythonのダブルアンダースコア名の動機ユースケースを発見したと働いアウトの例は、以下を参照してください。http://docs.python.org/tutorial/classes.html#private-variableshttp://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 
    __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

明白ではないかもしれないことは、基底クラスのメソッドがパブリックでなければならないか、完全にマングルされた名前を使用する必要があるということです。 Pythonには "protected"または "friend"修飾子がありません。したがって、スーパークラスから基本クラスに 'def __doSomething(self): 'を単にリファクタリングすると、スーパークラスからアクセスできなくなります。あなたはそれをパブリック 'def doSomething(self):"にしなければならないか、またはmangledな名前を使用する必要があります。 –

関連する問題