Python では、サブクラスは親クラスのメソッドをオーバーライド (オーバーライド) できます。つまり、サブクラスはスーパークラスのメソッドと同じ名前のメソッドを定義でき、そのメソッドが呼び出されるときは、スーパークラスのメソッドではなくサブクラスのメソッドが呼び出されます。
以下は、サブクラスで親クラスのメソッドをオーバーライドする方法を示す簡単な例です。
class Animal:
def make_sound(self):
print("The animal makes a sound.")
class Dog(Animal):
def make_sound(self):
print("The dog barks.")
my_animal = Animal()
my_animal.make_sound() # 输出 "The animal makes a sound."
my_dog = Dog()
my_dog.make_sound() # 输出 "The dog barks."
上の例では、Animal クラスと Dog クラスを定義しました。Animal クラスには、メッセージを出力する make_sound というメソッドがあります。Dog クラスは Animal クラスを継承し、さまざまなメッセージを出力するために make_sound メソッドをオーバーライドします。
Animal オブジェクトを作成し、make_sound メソッドを呼び出すと、出力は「動物は音を出します。」となります。Dog オブジェクトを作成して make_sound メソッドを呼び出すと、Dog クラスが Animal クラスの make_sound メソッドをオーバーライドするため、出力は「The Dog barks.」となります。
サブクラスが親クラスのメソッドをオーバーライドする場合、サブクラスのメソッドが親クラスのメソッドを完全に置き換えることに注意してください。サブクラスで親クラスのメソッドを呼び出す必要がある場合は、super() 関数を使用できます。
ただし、すべてに例外があり、親クラスからサブクラスに継承されたクラス メソッドのほとんどはサブクラスに適しているが、親クラスから直接コピーできない個別のクラス メソッドが存在する場合があり、このクラス メソッドを変更しないと、サブクラス オブジェクトが使用できなくなります。この場合、親クラスのメソッドをサブクラスで繰り返す必要があります。
たとえば、鳥には通常、翼があり、飛ぶことができるため、次のように鳥に関連するクラスを定義できます。 class Bird: #birds have neighbors def isWing(self): print("birds have neighbors") #birds can fly def fly(self): print("birds can fly") ただし、ダチョウの場合、同じ鳥で翼がありますが、飛ぶことはできず、走ることしかでき
ませ
ん。この状況では、次のようにダチョウを定義できます。class Ostrich(Bird): # Bird の fly() メソッドをオーバーライドします。 class def fly(self): print("Ostrich can't fly") Ostrich は Bird から継承しているため、Ostrich クラスには Bird クラスの isWing() メソッドと fly() メソッドがあることがわかります。このうち、isWing()メソッドはOstrichにも適していますが、fly()は明らかに適していないので、Ostrichクラスのfly()メソッドを書き換えます。書き換えはオーバーライドとも呼ばれ、クラス内の既存のメソッドの内部実装を変更することを指します。
上記 2 つのコードを基に、次のコードを追加して実行します。
class Bird:
#Bird haswings
def isWing(self):
print("Bird has tons")
#Bird can fly
def fly(self):
print("Bird can fly")
class Ostrich(Bird):
#Rewrite the fly() メソッド of the Bird class
def fly(self):
print("Ostrich can't fly")
ダチョウのオブジェクトを作成する
ostrich = Ostrich()
#Ostrich クラスで書き換えられた fly() クラス メソッドを呼び出します。ostrich.fly
()の実行結果は次のよう
になります:
ダチョウは飛べない
明らかに、ostrich はオーバーライドされた fly() クラス メソッドを呼び出します。
オーバーライドされたメソッドを呼び出す方法
実際、親クラスから継承したクラスメソッドをサブクラスでオーバーライドすると、そのメソッドがサブクラスオブジェクトを通じてクラス外で呼び出されるとき、Python は常にオーバーライドされたメソッドをサブクラスで実行します。
これにより、親クラスでオーバーライドされたメソッドを呼び出したい場合はどうすればよいかという新たな問題が生じます。
それは非常に簡単で、前述したように、Python のクラスは独立した空間とみなすことができ、クラス メソッドは実際にはこの空間内の関数です。また、グローバル空間のクラス空間で関数を呼び出したい場合は、関数を呼び出すときにクラス名をメモするだけで済みます。例:
class Bird:
#鳥には羽がある
def isWing(self):
print("鳥には羽がある")
#鳥は飛べる
def fly(self):
print("鳥は飛べる")
class Ostrich(Bird):
# Bird クラスの fly() メソッドをオーバーライドする
def fly(self):
print("ダチョウは飛べない")
ダチョウのオブジェクトを作成する
ostrich = Ostrich()
#Bird クラスの fly() メソッドを呼び出す
Bird.fly(ostrich)
プログラムの実行結果は次のようになります:
鳥は飛ぶことができます
このプログラムでは、クラス名を使用してそのクラス メソッドを呼び出す場合、Python はメソッドの最初の self パラメーターのバインディング値をカスタマイズしないため、この呼び出しメソッドの self パラメーターに手動で値を割り当てる必要があることに注意する必要があります。
このクラス名を通じてインスタンスメソッドを呼び出す方法は、アンバインドメソッドとも呼ばれます。
公式アカウント「駅長ヤン・チャンシェン」をフォローし、携帯電話ですべてのチュートリアルを読んで、いつでもどこでも学習してください。これには、ネットワーク全体上の書籍やビデオを無料でダウンロードできる検索アーティファクトが含まれています。