Pythonと他のオブジェクト指向言語同様に、各クラスが親クラスからプロパティとメソッドを継承する1つ以上のベースクラスを持つことができます。メソッドはサブクラスのインスタンスで呼び出され、またはプロパティはサブクラスのインスタンスでアクセスされますが、メソッドやプロパティはサブクラスに存在しない場合は、自動的に彼の父を見つけるために、クラスに行きます。
親クラスを継承した後、あなたは親クラスにアクセスするには、統合プロセスを完了するために、親クラスのメソッドとプロパティを呼び出すことができ、あなたが呼び出したいサブクラスのコンストラクタです。
サブクラスは、明示的に親クラスのコンストラクタを呼び出すことはありませんし、親クラスのコンストラクタにはいくつかのプロパティを初期化し、問題があるでしょう
子クラスと親クラスがコンストラクタを持っている場合、実際には、それはあなたが明示的に親クラスのコンストラクタを呼び出していない場合は、サブクラスは、親クラスのコンストラクタをオーバーライドする場合、親クラスのコンストラクタは、サブクラスのインスタンスへのアクセスが得られ、実行されません最初の変数で親クラスの初期化メソッドが問題になります。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class
A:
def __init__(self):
self.namea=
"aaa"
def funca(self):
print(
"function a : %s"
%self.namea)
class
B(A):
def __init__(self):
self.nameb=
"bbb"
def funcb(self):
print(
"function b : %s"
%self.nameb)
b=B()
print(b.nameb)
b.funcb()
b.funca()
|
結果:
1
2
3
4
5
6
7
8
|
bbb
function b : bbb
Traceback (most recent call last):
File
"/home/lai/workspace/sru/2.py"
, line 24,
in
<module>
b.funca()
File
"/home/lai/workspace/sru/2.py"
, line 11,
in
funca
print(
"function a : %s"
%self.namea)
AttributeError:
'B'
object
has no attribute
'namea'
|
サブクラスでは、コンストラクタが書き換えられるが、親クラスの初期化の性質にはコードnamea新しい構築方法、所望の効果を達成するために、サブクラスの構成は、実質的にスーパークラスのコンストラクタを呼び出す必要があります初期化。結合していないバージョンがスーパークラスのコンストラクタを呼び出す、またはスーパー機能を使用します。この目標を達成するには2つの方法があります。
方法の一つ:スーパークラスのコンストラクタを呼び出して結合していません
複数行でコードを変更します。
DEF __init __(自己):
self.namea = "AAA"
DEF FUNCA(自己):
プリント( "機能A:%S" %self.namea)
、クラスB(A):
デフ__init __(自己):
自己。 nameb = "BBB"
#这一行解决了问题
A .__ INIT __(自己)
デフfuncBの(自己):
プリント( "機能B:%s"の%のself.nameb)
B = B()
プリント(b.nameb)
B。 funcBの()
b.funca()
結果
1
2
3
|
bbb
function b : bbb
function a : aaa
|
この問題を解決するための注釈付きのラインとして、親クラスの名前を直接使用することは、そのコンストラクタを呼び出します。
このメソッドはコンストラクタ結合していないコール親クラスと呼ばれています。インスタンスメソッドを呼び出す場合、メソッドの自己パラメータが自動的にインスタンス(結合法と呼ばれる)にバインドされています。(例えば.__のINITなど)メソッドを直接クラスを呼び出す場合は、次にインスタンスが結合されていないがあります。これは、この方法では、未結合方法が結合されていないと呼ばれている、無料のセルフ必要なパラメータを提供します。
本実施例により、自己結合していないパラメータを提供するための方法として、Bはnamea変数が設定されているように実装されたすべての親クラスのコンストラクタを使用することができます。
方法2:スーパー機能
コード、オリジナルのコードに増加する2行を追加する必要性を変更します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#父类需要继承object对象
class
A(
object
):
def __init__(self):
self.namea=
"aaa"
def funca(self):
print(
"function a : %s"
%self.namea)
class
B(A):
def __init__(self):
#这一行解决问题
super(B,self).__init__()
self.nameb=
"bbb"
def funcb(self):
print(
"function b : %s"
%self.nameb)
b=B()
print(b.nameb)
b.funcb()
b.funca()
|
同じ方法での結果
1
2
3
|
bbb
function b : bbb
function a : aaa
|
これはPythonのであるから、スーパー機能を使用するためには、オブジェクトクラスの最初の文がクラスAを継承することができ、新たな注釈付きコード、については、「新しいクラス」機能がサポートされています。現在鉱山とオブジェクトパラメータスーパー関数として使用することができ、任意のメソッド呼び出し関数は、スーパークラスのオブジェクトではなく現在のクラスの方法と呼ばれる返します。
スーパー機能は自動的に親と親クラスのすべての親を見つける分析方法、分析プロセスのために責任があるスーパーオブジェクトを返します。
より直感的な方法は、第二の方法は、そのすべてのスーパークラスを初期化することができます
スーパー機能、より直感的なスーパー、疲れよりも、直接結合していないメソッドを呼び出しますが、子クラスが親クラスを継承した場合の最大のは、それだけですることができ、超機能を使用する必要があり、もう少しです。しかし、この要件なしで、直接使用するA .__のinit __(自己)より直感的。
親はそれのサブクラスを呼び出すことができますか?
● 把子类传递到父类的有参构造中,然后调用。
● 使用反射的方式调用,你使用了反射还有谁不能调用的?!
● 父类调用子类的静态方法。
案例展示:
package com.ywq;
public class Test2{
public static void main(String[] args)
{
Son son = new Son();
Father father=new Father(son);
father.fun1();
father.fun4();
}
}
class Father{
public Son son;
public Father(Son son){
this.son=son;
}
public Father() {
}
public void fun4(){
//方法3:使用反射的方式调用子类方法
try {
Class cls=Class.forName("com.ywq.Son");
Son son=(Son) cls.newInstance();
son.fun2();
} catch (Exception e) {
e.printStackTrace();
}
}
public void fun1(){
//方法1:把子类传递到父类的有参构造函数中,然后调用。
System.out.println("我是父类的方法");
son.fun2();
//方法2:父类调用子类的静态方法。
Son.fun3();
}
}
class Son extends Father{
public static void fun3(){
System.out.println("我是子类的静态方法");
}
public void fun2(){
System.out.println("我是子类的方法");
}
}
这三种都是父类直接调用子类的方法,
参考:https://blog.csdn.net/oschina_41675984/article/details/80373587