python3クラスの継承

1.継承の定義

継承は、新しいクラスを作成する方法です。Pythonでは、新しいクラスは1つ以上の親クラスを継承できます。

2.単一継承と多重継承

class ParentClass1: #定义父类
    pass

class ParentClass2: #定义父类
    pass

class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass
    pass

class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类
    pass

継承を表示

>>> SubClass1.__bases__ #__base__只查看从左到右继承的第一个子类,__bases__则是查看所有继承的父类
(<class '__main__.ParentClass1'>,)
>>> SubClass2.__bases__
(<class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>)

ヒント:基本クラスが指定されていない場合、pythonクラスはデフォルトでオブジェクトクラスを継承します。Objectはすべてのpythonクラスの基本クラスであり、いくつかの一般的なメソッド(__str__など)の実装を提供します。

>>> ParentClass1.__bases__
(<class 'object'>,)
>>> ParentClass2.__bases__
(<class 'object'>,)

3.継承と抽象化(最初に抽象化してから継承)

抽象化とは、類似またはより類似した部分を抽出することです。

抽象化には2つのレベルがあります。

オバマとメッシの同様の部分をクラスに抽出します。

親クラスとして、人、豚、犬の3つのクラスの類似した部分を抽出します。

抽象化の主な機能は、カテゴリを分割することです(懸念を分離し、複雑さを軽減できます)。
画像の説明を追加してください
継承:抽象化の結果に基づいています。プログラミング言語でそれを実現するには、まず抽象化のプロセスを経てから実行する必要があります。継承による抽象化を表現します。構造。

抽象化は、分析と設計のプロセスにおける単なるアクションまたはスキルであり、抽象化を通じて、クラスを取得できます
画像の説明を追加してください
。4.継承と再利用性

最初の部分

例えば

猫ができること:ニャー、食べる、飲む、引っ張る、振りかける

犬はできる:樹皮、食べる、飲む、引っ張る、振りかける

catとdogのクラスをそれぞれ作成する場合は、catとdogのすべての関数を実装する必要があります。擬似コードは次のとおりです。

#猫和狗有大量相同的内容
class 猫:

    def 喵喵叫(self):
        print '喵喵叫'

    def 吃(self):
        # do something

    def 喝(self):
        # do something

    def 拉(self):
        # do something

    def 撒(self):
        # do something

class 狗:

    def 汪汪叫(self):
        print '汪汪叫'

    def 吃(self):
        # do something

    def 喝(self):
        # do something

    def 拉(self):
        # do something

    def 撒(self):
        # do something

第二部

上記のコードから、食べる、飲む、引く、投げるのは猫と犬の両方の機能であることがわかりますが、猫と犬の別々のクラスで2回作成しました。継承のアイデアが使用される場合、それは次のように実装されます:

動物:食べる、飲む、引く、振りかける

猫:ニャー(猫は動物から機能を継承します)

犬:吠える(犬は動物の機能を受け継ぐ)

擬似コードは次のとおりです。

class 动物:

    def 吃(self):
        # do something

    def 喝(self):
        # do something

    def 拉(self):
        # do something

    def 撒(self):
        # do something

# 在类后面括号中写入另外一个类名,表示当前类继承另外一个类
class 猫(动物):

    def 喵喵叫(self):
        print '喵喵叫'
        
# 在类后面括号中写入另外一个类名,表示当前类继承另外一个类
class 狗(动物):

    def 汪汪叫(self):
        print '汪汪叫'

第三部

#继承的代码实现
class Animal:

    def eat(self):
        print("%s 吃 " %self.name)

    def drink(self):
        print ("%s 喝 " %self.name)

    def shit(self):
        print ("%s 拉 " %self.name)

    def pee(self):
        print ("%s 撒 " %self.name)


class Cat(Animal):

    def __init__(self, name):
        self.name = name
        self.breed = '猫'

    def cry(self):
        print('喵喵叫')

class Dog(Animal):

    def __init__(self, name):
        self.name = name
        self.breed='狗'

    def cry(self):
        print('汪汪叫')


# ######### 执行 #########

c1 = Cat('小白家的小黑猫')
c1.eat()

c2 = Cat('小黑的小白猫')
c2.drink()

d1 = Dog('胖子家的小瘦狗')
d1.eat()

継承を使用してコードを再利用する良い例

プログラムの開発過程で、クラスAを定義し、別のクラスBを作成したい場合、クラスBの内容のほとんどはクラスAの内容と同じです。

クラス継承の概念を使用するクラスBを最初から作成することはできません。

継承によって新しいクラスBを作成し、BにAを継承させると、BはAのすべての属性(データ属性と関数属性)を「継承」して、コードの再利用を実現します。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:660193417
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class Animal:
    '''
    人和狗都是动物,所以创造一个Animal基类
    '''
    def __init__(self, name, aggressivity, life_value):
        self.name = name  # 人和狗都有自己的昵称;
        self.aggressivity = aggressivity  # 人和狗都有自己的攻击力;
        self.life_value = life_value  # 人和狗都有自己的生命值;

    def eat(self):
        print('%s is eating'%self.name)

class Dog(Animal):
    pass

class Person(Animal):
    pass

egg = Person('egon',10,1000)
ha2 = Dog('二愣子',50,1000)
egg.eat()
ha2.eat()

ヒント:既存のクラスを使用して新しいクラスを作成します。これにより、既存のソフトウェアの一部とほとんどの設定が再利用され、プログラミングの作業負荷が大幅に増加します。これは、ソフトウェアの再利用と呼ばれることがよくあります。独自のクラスを再利用できるだけではありません。 、標準ライブラリなどの他のライブラリから継承して、新しいデータタイプをカスタマイズすることもできます。これにより、ソフトウェア開発サイクルが大幅に短縮され、大規模なソフトウェア開発にとって非常に重要になります。

5.クラスの派生

もちろん、サブクラスは独自の新しい属性を追加したり、これらの属性を独自に再定義したりすることもできます(親クラスには影響しません)。プロパティに関しては、ユーザー次第です。

class Animal:
    '''
    人和狗都是动物,所以创造一个Animal基类
    '''
    def __init__(self, name, aggressivity, life_value):
        self.name = name  # 人和狗都有自己的昵称;
        self.aggressivity = aggressivity  # 人和狗都有自己的攻击力;
        self.life_value = life_value  # 人和狗都有自己的生命值;

    def eat(self):
        print('%s is eating'%self.name)

class Dog(Animal):
    '''
    狗类,继承Animal类
    '''
    def bite(self, people):
        '''
        派生:狗有咬人的技能
        :param people:  
        '''
        people.life_value -= self.aggressivity

class Person(Animal):
    '''
    人类,继承Animal
    '''
    def attack(self, dog):
        '''
        派生:人有攻击的技能
        :param dog: 
        '''
        dog.life_value -= self.aggressivity

egg = Person('egon',10,1000)
ha2 = Dog('二愣子',50,1000)
print(ha2.life_value)
print(egg.attack(ha2))
print(ha2.life_value)

:ha2.life_valueのような属性参照は、最初にインスタンスで、次にクラスで、次に親クラスで...最上位の親クラスまでlife_valueを検索します。

サブクラスでは、新しく作成された同じ名前の関数属性で、関数内の関数を編集するときに、親クラスで同じ名前の関数関数を再利用する必要がある場合があります。これは、通常の関数を呼び出す方法です。つまり、classname.func()です。この時点では、通常の関数を呼び出すのと同じであるため、selfパラメーターにも値を渡す必要があります。

python3では、親クラスを実行するサブクラスのメソッドは、スーパーメソッドを直接使用することもできます。
(1)夕食

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:660193417
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class A:
    def hahaha(self):
        print('A')

class B(A):
    def hahaha(self):
        super().hahaha()
        #super(B,self).hahaha()
        #A.hahaha(self)
        print('B')

a = A()
b = B()
b.hahaha()
super(B,b).hahaha()

(2)マンドッグバトル

class Animal:
    '''
    人和狗都是动物,所以创造一个Animal基类
    '''
    def __init__(self, name, aggressivity, life_value):
        self.name = name  # 人和狗都有自己的昵称;
        self.aggressivity = aggressivity  # 人和狗都有自己的攻击力;
        self.life_value = life_value  # 人和狗都有自己的生命值;

    def eat(self):
        print('%s is eating'%self.name)

class Dog(Animal):
    '''
    狗类,继承Animal类
    '''
    def __init__(self,name,breed,aggressivity,life_value):
        super().__init__(name, aggressivity, life_value) #执行父类Animal的init方法
        self.breed = breed  #派生出了新的属性

    def bite(self, people):
        '''
        派生出了新的技能:狗有咬人的技能
        :param people:  
        '''
        people.life_value -= self.aggressivity

    def eat(self):
        # Animal.eat(self)
        #super().eat()
        print('from Dog')

class Person(Animal):
    '''
    人类,继承Animal
    '''
    def __init__(self,name,aggressivity, life_value,money):
        #Animal.__init__(self, name, aggressivity, life_value)
        #super(Person, self).__init__(name, aggressivity, life_value)
        super().__init__(name,aggressivity, life_value)  #执行父类的init方法
        self.money = money   #派生出了新的属性

    def attack(self, dog):
        '''
        派生出了新的技能:人有攻击的技能
        :param dog: 
        '''
        dog.life_value -= self.aggressivity

    def eat(self):
        #super().eat()
        Animal.eat(self)
        print('from Person')

egg = Person('egon',10,1000,600)
ha2 = Dog('二愣子','哈士奇',10,1000)
print(egg.name)
print(ha2.name)
egg.eat()

派生クラスと基本クラスの関係は、継承によって確立されます。これは、白馬が馬であり、人が動物であるなど、「はい」の関係です。

クラス間に共通の関数が多い場合は、継承を利用してこれらの共通の関数を抽出し、基本クラスにすることをお勧めします。たとえば、教授は教師です。

>>> class Teacher:
...     def __init__(self,name,gender):
...         self.name=name
...         self.gender=gender
...     def teach(self):
...         print('teaching')
... 
>>> 
>>> class Professor(Teacher):
...     pass
... 
>>> p1=Professor('egon','male')
>>> p1.teach()

おすすめ

転載: blog.csdn.net/m0_67575344/article/details/124150648