2012-02-03 4 views

答えて

2

これは非常に広い質問です。あなたがサンプルコードを提供していないとして、私は最も簡単な例を紹介します:

class A(object): 
    def meth1(self, a): 
     self.meth2(a, a*a) 

class B(A): 
    def meth2(self, a, b): 
     return b/a 

b = B() 
b.meth1(10) 
+0

'a'はどこから来たのですか?どこのメソッド 'meth'? –

+1

@Tichodroma申し訳ありませんが、私のせいです。書くときに考えるべきである;-)今修正された。 – glglgl

+0

クラスが別々のモジュールにある場合はどうなりますか? file2.pyすなわちインポートFILE1 クラステストケース(file1.TestBase): はDEF(自己)を実行: self.pass() file1.pyクラスTestBase: はDEF(自己を渡します): print "PASS" testBase = TestBase() testBase.execute() – ThePracticalOne

9

サブクラスの背後にあるポイントは、それが変更スーパークラスの動作を拡張することです。スーパークラスは、を知ることができません。サブクラスがどのようにそれを拡張するのですか?

編集:しかし、スーパークラスが知っていることも可能である、サブクラスがそれを拡張します。確かに、これは良いデザインだと思います。ここで

0

は私が試したものです:

class A(object): 
    def x(self): 
     print self.y() 

class B(A): 
    def y(self): 
     return 1 

>>> B().x() 
1 

だから、あなたはいくつかの特定の問題を抱えていない限り、単に基底クラスにサブクラスからメソッドを呼び出すと、それだけで動作するはずです。

+1

なぜ誰かがこれをやろうと思っているのだろうか。なぜ私は 'B'がそれをどのように拡張するのかを前もって知らないように' A'を書いていますか? –

+1

@Tichodroma:ええ、ここにいくつかのコードの匂いがあります。しかし、おそらくそれは多分です。現実と同期していないOPの講師;) –

+4

@Tichodroma多分あなたはそれを知らないのですか? 'A'を、例えば3つまたは4つの方法で拡張できる基本クラスとしましょう。どのように実装されているか、どのシグネチャしか提供していないかはわかりません。私はそのようなことを頻繁に見てきました。 「MySQLdb」にあります。 – glglgl

0

これは、抽象メソッドの使用に関連していると思います。親クラスは、サブクラスが実装すべきメソッドを定義し、親クラスはこれらのメソッドが実装されることを認識します。同様の構造が、例えばJavaに存在する。 Pythonでこれらを使用して

はよくここで議論されていますAbstract methods in Python

7

私は、これがしばしば使用されるパターンであると考えています。

class A(object): 
    def x(self): 
     self.y() 

    def y(self): 
     print('default behavior') 


class B(A): 
    def y(self): 
     print('Child B behavior') 

class C(A): 
    def z(self): 
     pass 

>>>B().x() 
Child B behavior 
>>>C().x() 
default behavior 

これは、抽象クラスのようなものですが、デフォルト動作を提供します。しかし、私の頭の上からパターンの名前を覚えていない。

+0

C++の用語を使用すると、多態性だけになります。しかし、Pythonを使用すると、すべてに当てはまります... – matsjoyce

関連する問題