序文
クラスを作成するときは、常に白紙の状態から始める必要はありません。作成するクラスと既存のクラスの間の場合一定の継承関係があるできるとき継承によるコードの再利用開発効率の向上が目的です。Python で継承を実装する方法は次のとおりです。
1.継承の基本文法
継承はオブジェクト指向プログラミングの最も重要な機能の 1 つは、人間が客観的な世界を理解するプロセスに由来するもので、自然界に共通する現象です。たとえば、私たちはそれぞれ、祖父母や両親からいくつかの身体的特徴を受け継いでいますが、両親には反映されていない独自の特徴を持っているため、両親とは異なります。. プログラム設計における継承の実装、表現このクラスは、継承元のクラスのすべてのパブリック メンバーまたは保護されたメンバーを所有しています。. オブジェクト指向プログラミングでは、継承されたクラス親または基本クラスと呼ばれ、新しいクラスサブクラスまたは派生クラスと呼ばれます。
継承によるコードの再利用だけでなく、まあまあ継承によるクラス間の関係の整理. Python では、クラス定義ステートメントで、クラス名の右側に一対の括弧を使用して、継承する基本クラスの名前を囲み、クラスの継承を実現します。具体的な構文形式は次のとおりです。
class ClassName(baseclasslist):
'''类的帮助信息''' # 类文档字符串
statement # 类体
パラメータの説明:
- ClassName : クラス名を指定するために使用されます。
- baseclasslist : 指定に使用継承元の基底クラス、複数存在する可能性があり、クラス名はコンマ「,」で区切られます。指定しない場合、すべての Python オブジェクトの基本クラスオブジェクトが使用されます。
- '''クラスのヘルプ情報''' : クラスのドキュメント文字列を指定するために使用します. 文字列を定義した後, クラスのオブジェクトを作成するとき, クラス名と左括弧 "(" を入力した後, 情報が表示されます。
- statement : クラス本体。主に、クラス変数 (またはクラス メンバー)、メソッド、および属性などの定義ステートメントで構成されます。クラスを定義するときにクラスの特定の機能について考えない場合は、代わりにクラス本体でpassステートメントを直接使用することもできます。
たとえば、フルーツ クラス Fruit を (基本クラスとして) 定義し、このクラスに class 属性 (フルーツのデフォルトの色を保存するために使用) と Harvest() メソッドを定義してから、Banana クラスと Grape クラスを作成します。両方とも Fruit クラスから継承され、最後に Banana クラスと Grape クラスのインスタンスを作成し、harvest() メソッド (基本クラスで記述) を呼び出すと、コードは次のようになります。
class Fruit: # 定义水果类(基类)
color = '绿色' # 定义类属性
def harvest(self, color):
print('水果是{}的'.format(color)) # 输出的是形式参数color
print('水果已经收获......')
print('水果原来是{}的'.format(Fruit.color)) # 输出的是类属性color
class Banana(Fruit): # 定义香蕉类(派生类)
color = '黄色'
def __init__(self):
print('我是香蕉')
class Grape(Fruit): # 定义葡萄类(派生类)
color = '紫色'
def __init__(self):
print('我是葡萄')
banana = Banana() # 创建类的实例(香蕉)
banana.harvest(banana.color) # 调用基类的harvest()方法
grape = Grape() # 创建类的实例(葡萄)
grape.harvest(grape.color) # 调用基类的harvest()方法
上記のコードを実行すると、次の図に示すような結果が表示されます。
実行結果からわかるように、Banana クラスと Grape クラスには Harvest() メソッドはありませんが、Python は派生クラスが基本クラス メソッドにアクセスできるようにする。
2. メソッドの書き換え
基本クラスのメソッドが派生クラスに継承されると、基本クラスのメンバーが継承されます。完全には当てはまらない派生クラスを使用する場合は、派生クラスで親クラスのこのメソッドをオーバーライドする必要があります。
上記のコード例では、次の図に示すように、基本クラスで定義されたハーベスト() メソッドは、派生クラスが何であれ、果物の名前を表示する代わりに「果物...」を表示します。
さまざまな果物にさまざまなヒントを与えたい場合は、派生クラスでハーベスト() メソッドをオーバーライドできます。コードは以下のように表示されます:
class Fruit: # 定义水果类(基类)
color = '绿色' # 定义类属性
def harvest(self, color):
print('水果是{}的'.format(color)) # 输出的是形式参数color
print('水果已经收获......')
print('水果原来是{}的'.format(Fruit.color)) # 输出的是类属性color
class Banana(Fruit): # 定义香蕉类(派生类)
color = '黄色'
def __init__(self):
print('我是香蕉')
def harvest(self, color):
print('香蕉是{}的'.format(color)) # 输出的是形式参数color
print('香蕉已经收获......')
print('香蕉原来是{}的'.format(Fruit.color)) # 输出的是类属性color
banana = Banana() # 创建类的实例(香蕉)
banana.harvest(banana.color) # 调用基类的harvest()方法
上記のコードを実行すると、結果は次のように表示されます。
我是香蕉
香蕉是黄色的
香蕉已经收获......
香蕉原来是绿色的
3. 派生クラスで基底クラスの _ _init _ _() メソッドを呼び出す
_ _ init _ _() メソッドを派生クラスで定義する場合、自動的に呼び出されない基本クラスの _ _ init _ _() メソッド。たとえば、Fruit クラスを定義し、_ _ init _ _() メソッドでクラス属性 color を作成し、Fruit クラスで Harvest() メソッドを定義し、このメソッドでクラス属性 color の値を出力してから、 Class Banana クラスを作成し、最後に Banana クラスのインスタンスを作成し、harvest() メソッドを呼び出すと、コードは次のようになります。
class Fruit: # 定义水果类(基类)
def __init__(self, color = '绿色'):
Fruit.color = color # 定义类属性
def harvest(self):
print('水果原来是{}的'.format(Fruit.color)) # 输出的是类属性color
class Banana(Fruit): # 定义香蕉类(派生类)
def __init__(self):
print('我是香蕉')
banana = Banana() # 创建类的实例(香蕉)
banana.harvest() # 调用基类的harvest()方法
上記コード実行後、下図の例外情報が表示されます。
したがって、派生クラスが基底クラスの _ _ init _ _() メソッドを呼び出して必要な初期化を行うためには、派生クラスでsuper() 関数を使用して _ _ init _ _ を呼び出す必要があります。() 基底クラスのメソッド. 使用形式は次のとおりです。
super()._ _init_ _([参数1, ....])
注意:如果基类的初始化方法中有参数传入,则这里需要在 _ _init_ _() 括号中写入形式参数
上記のコードに super()._ _ init _ _() を追加した後のコードと実行結果を次の図に示します。