パイソン学習の第13回講義
1.継承の概要
class Doctor():
def study(self):
print('救死扶伤')
class Soldier():
def study(self):
print('保卫国家')
class Person():
name = ''
age = ''
上記の3つのクラスを接続する方法として、継承の概念を紹介します。
第二に、継承の導入
- 継承は、オブジェクト指向の3つの特性の1つです。
- 継承により、あるクラスから他のクラスの属性メソッドに戻ることができます。
- クラスを定義するときに、クラス名の後の括弧内に現在のクラスの親クラス(スーパークラス、基本クラス)を指定できます。
- 継承により、クラスの再利用性が向上し、クラス間の関係が作成されます。この関係で、それは多形性の特徴を持っています。
継承のデモンストレーション例1:
class Animal(object):
def sleep(self):
print('动物会睡觉')
def run(self):
print('动物会跑')
# 定义一个狗类:
# 1.在动物类上面进行修改,添加狗的特性:这样修改起来不比较麻烦,违反了OCP原则。
# 2.创建一个新的狗类:创建比较麻烦。会出现代码的重复。
class Dog(Animal):
def sleep(self):
print('狗会睡觉')
def run(self):
print('狗会跑')
def speak(self):
print('汪汪汪')
# 思路三:直接从animal类中继承他的属性与方法。
# class Dog(Animal):
# pass
dog = Dog()
dog.run()
dog.sleep()
印刷結果:
動物は走ることができます
動物は眠ります
継承のデモンストレーション例2:
class Animal(object):
def sleep(self):
print('动物会睡觉')
def run(self):
print('动物会跑')
# 定义一个狗类:
# 1.在动物类上面进行修改,添加狗的特性:这样修改起来不比较麻烦,违反了OCP原则。
# 2.创建一个新的狗类:创建比较麻烦。会出现代码的重复。
# 思路三:直接从animal类中继承他的属性与方法。
class Dog(Animal):
pass
dog = Dog()
dog.run()
dog.sleep()
出力結果の出力:
動物は走ります。
動物は眠ります。
要約:親クラスと子クラスが同じメソッドを持っている場合、呼び出しは最初に子クラスのメソッドを呼び出し、子クラスは親クラスのメソッドを呼び出しません。エラーがない場合はエラーを報告してください。
3、メソッドの書き換え
- メソッドの書き換え:サブクラスと親クラスに同じ名前のメソッドがある場合、サブクラスインスタンスを介してメソッドが呼び出されると、親メソッドの代わりにサブクラスメソッドが呼び出されます。この機能はメソッドの書き換えと呼ばれます(カバー)。
デモンストレーションの例:
class Yi(object):
def test(self):
print('这是第Yi个类')
class Er(Yi):
def test(self):
print('这是第Er个类')
class San(Er):
def test(self):
print('这是第San个类')
er = Er()
er.test()
印刷出力結果:
これはErクラスです
- 総括する:
- 1.オブジェクトのメソッドを呼び出すときは、最初に現在のオブジェクトでメソッドを探し、存在する場合は直接呼び出します。
- 2.そうでない場合は、現在のオブジェクトの親クラスに移動して、親クラスに存在する場合は、親クラスのメソッドを直接呼び出します。
- 3.そうでない場合は、親クラスの親クラスに移動して検索します。オブジェクトが見つかったことを確認し、それでも見つからない場合は、エラーを直接報告します。
4、スーパー()メソッド
- スーパーメソッドの役割:元の親クラスのメソッドを呼び出す前に、親クラスのメソッドを書き換えることができます。
サンプルデモンストレーション:
パラメーターなし
class Animal(object):
name = '动物'
def sleep(self):
print('动物会睡觉')
def run(self):
print('动物会跑')
class Dog(Animal):
def sleep(self):
print('狗会睡觉')
# Animal.sleep(self)
super(Dog, self).sleep() # python 2的写法
super().sleep() # python 3的写法
def run(self):
print('狗会跑')
def speak(self):
print('汪汪汪')
dog = Dog()
dog.sleep()
印刷出力結果:
犬の睡眠、
動物の睡眠、
動物の睡眠
要約:
それらを使用する2つの方法、すなわちpython2とpython3
super(Dog、self).sleep()---- python2は
super(を使用することをお勧めしません).sleep()---- python3書き込み
デモ例2:
パラメーター付き
# 有参数init方法(必须了解)
class Animal(object):
# init方法必须传入参数
def __init__(self, name, age):
self.name = name
self.age = age
print('动物')
def sleep(self):
print('动物会睡觉')
def run(self):
print('动物会跑')
class Dog(Animal):
# 方法的重写:
# init父类传入参数的同时,子类中init方法也需要传入参数
# 重点理解
def __init__(self, name, age):
self.name = name
self.age = age
# 在init方法中传入参数的同时,super方法也许要传入参数。(二者同时使用时!)
super().__init__(self.name, self.age)
print('狗')
def sleep(self):
print('狗会睡觉')
# Animal.sleep(self)
# super(Dog, self).sleep(self.name, self.age) # python 2的写法
super().sleep() # python 3的写法
def run(self):
print('狗会跑')
def speak(self):
print('汪汪汪')
dog = Dog('猫', 10)
# dog.sleep()
印刷結果:
動物の
犬
5、複数の継承
- pythonでは複数の継承がサポートされており、クラスに複数の親クラスを同時に指定できます。
- クラス名の括弧内に複数の親クラスを追加して、複数の継承を実現できます。
- 複数の継承により、子クラスは同時に複数の親クラスを持つようになり、親クラスのすべてのメソッドに戻ります。
- 開発には特別な状況はありません。複数の継承はコードをより複雑にするため、複数の継承への適応を避けるように努める必要があります。
- 複数の親クラスに同じ名前のメソッドがある場合、それらは最初の親クラスで検索され、次に2番目と3番目で検索されます。前面が背面を覆います。
# 演示示例1:
class A(object):
def text(self):
print('这是A类')
class B(object):
def test(self):
print('这是B类')
class C(A, B):
pass
c = C()
c.test()
# 演示示例2:
class A(object):
def text(self):
print('这是A类')
class B(object):
def test(self):
print('这是B类')
class C(A, B):
pass
c = C()
c.text()
# 演示示例3:
class A(object):
def text(self):
print('这是A类')
class B(object):
def test(self):
print('这是B类')
class C(A, B):
pass
c = C()
c.text()
c.test()
# 演示示例4:
class A(object):
def test(self):
print('这是A类')
class B(object):
def test(self):
print('这是B类')
class C(A, B):
pass
c = C()
c.test()
# 获取C所有父类的方法
print(C.__bases__)
# 打印输出结果:(<class '__main__.A'>, <class '__main__.B'>)
上記のコードは、複数の継承のいくつかの関連する例です。
出力結果を印刷する:
これはクラスBであり、
これはクラスAであり、
これはクラスであるA、これはクラスである
B、
これはクラスAである
(<クラスの主.A '>、<クラスの主.B'>)
拡張:デカップリング
- 問題解決の可能性を高めます。
- 問題解決効果を向上させます。
- 問題の解決策を改善します。
- 将来の発生の可能性を減らします。
六、多形
- 多形性は、オブジェクト指向の3つの特性の1つです。
- 多形性の概念:オブジェクトはさまざまな形式で表示できます。
- 多形性の特徴:
- 1.オブジェクトのタイプではなく、オブジェクトのインスタンスメソッドが同じ名前であるかどうかのみを考慮します。
- 2.オブジェクトのクラス間の継承関係はオプションです。
- 3.多態性の利点は、コードの外部呼び出しの柔軟性を高め、コードの用途を広げ、互換性を高めることができることです。
- 4.多態性は状態と方法の手法であり、クラスの内部設計には影響しません。
デモンストレーションの例:
class A(object):
def __init__(self, name):
self._name = name
# property装饰器(封装、查看属性)
@property
def name(self):
return self._name
@name.setter # 封装修改属性
def name(self, name):
self._name = name
class B(object):
def __init__(self, name):
self._name = name
# property装饰器(封装、查看属性)
@property
def name(self):
return self._name
@name.setter # 封装修改属性
def name(self, name):
self._name = name
# 添加属性并对属性进行赋值
a = A('刘亦菲')
b = B('周慧敏')
# 外部定义函数,与类相互使用
def speak(obj):
print('大家好,我是%s' % obj.name)
# 调用函数
speak(a)
speak(b)
印刷出力結果:
みなさん、こんにちは、Liu Yifeiです。
みなさん、こんにちは、Zhou Huiminです。
概要:
異なる関数を持つ関数は、同じ関数名を使用して、異なるコンテンツを呼び出すことができます。
機能:
クラスと関数の組み合わせにより、異なる結果が生成されます。
継承関係がないことのデモンストレーションの例:
class Duck(object):
def fly(self):
print('鸭子沿着水面飞起来了')
class Swan(object):
def fly(self):
print('天鹅在天空中翱翔')
class Plane(object):
def fly(self):
print('飞机在天空做着眼镜蛇机动')
def fly(obj):
obj.fly()
duck = Duck()
fly(duck)
swan = Swan()
fly(swan)
plane = Plane()
fly(plane)
印刷結果:
アヒルが水に沿って
飛んでいる、白鳥が空を飛んでいる、
飛行機が空でコブラ操作をしている
継承関係のデモンストレーションの例:
class Grandpa(object):
def __init__(self, money):
self.money = money
def p(self):
print('这是爷爷')
class Father(Grandpa):
def __init__(self, money, job):
super().__init__(money)
self.job = job
def p(self):
print('这是父亲,我重写了爷爷的方法')
class Mother(Grandpa):
def __init__(self, money, job):
super().__init__(money)
self.job = job
def p(self):
print('这是母亲,我重写了爷爷的方法')
def fn(obj):
obj.p()
grandpa = Grandpa(5000)
father = Father(4000, '教授')
mother = Mother(3500, '博士后')
fn(grandpa)
fn(father)
fn(mother)
印刷結果:
これはおじいちゃんです、
これは父です、私はおじいちゃんの方法を書き直します、
これは母です、私はおじいちゃんの方法を書き直します
継承による不完全なコード、ご理解ください!