pythonオブジェクト向けプログラミングの組み合わせと継承


転載先:https://www.cnblogs.com/renpingsheng/p/7132407.html
クラスとクラスの間には、継承と組合せの2つの関係があります.マルチコンビネーションは少なく継承したほうがいいです.
まず2つの例を見てみましょう.まず2つのクラスを定義します.1つの先生クラス、先生クラスには名前、年齢、生まれた年、月と日、教えた授業などの特徴と歩くこと、教える技能があります.
class Teacher:
    def __init__(self,name,age,year,mon,day):
        self.name=name
        self.age=age
        self.year=year
        self.mon=mon
        self.day=day

    def walk(self):
        print("%s is walking slowly"%self.name)

    def teach(self):
        print("%s is teaching"%self.name)

もう一つの学生類を定義し、学生類には名前、年齢、生まれた年、月と日、学習のグループ名などの特徴と歩く、学習する技能がある.
class Student:
    def __init__(self,name,age,year,mon,day):
        self.name=name
        self.age=age
        self.year=year
        self.mon=mon
        self.day=day

    def walk(self):
        print("%s is walking slowly"%self.name)

    def study(self):
        print("%s is studying"%self.name)

クラスの継承という特性に基づいて,コードを縮小することができる.
人間を定義し、教師クラスと学生クラスに人間の特徴とスキルを継承させます.
class People:
    def __init__(self,name,age,year,mon,day):
        self.name=name
        self.age=age
        self.year=year
        self.mon=mon
        self.day=day

    def walk(self):
        print("%s is walking"%self.name)

class Teacher(People):
    def __init__(self,name,age,year,mon,day,course):
        People.__init__(self,name,age,year,mon,day)
        self.course=course

    def teach(self):
        print("%s is teaching"%self.name)

class Student(People):
    def __init__(self,name,age,year,mon,day,group):
        People.__init__(self,name,age,year,mon,day)
        self.group=group

    def study(self):
        print("%s is studying"%self.name)

更に先生と学生を実例化して、1人の先生と1人の学生を得ます.
t1=Teacher("alex",28,1989,9,2,"python")
s1=Student("jack",22,1995,2,8,"group2")

今、t 1とs 1の名前、年齢、生まれた年、月、日を知りたいのは簡単ですが、t 1やs 1の誕生日を一度に印刷するのはそんなに簡単ではありません.このとき、文字列でつなぎ合わせる必要があります.もっと良い方法はありませんか.
それが組み合わせです.
               ,                。

誰もが誕生日を持っていると言えますが、人が誕生日とは言えないので、組み合わせの機能を使う必要があります.生年月日と日を別の日付のクラスに定義して、先生や学生とこの日付のクラスを組み合わせると、先生t 1や学生s 1の誕生日が簡単に得られ、文字列のつなぎ合わせが面倒になりません.次のコードを見てみましょう.
class Date:
    def __init__(self,year,mon,day):
        self.year=year
        self.mon=mon
        self.day=day

    def birth_info(self):
        print("The birth is %s-%s-%s"%(self.year,self.mon,self.day))

class People:
    def __init__(self,name,age,year,mon,day):
        self.name=name
        self.age=age
        self.birth=Date(year,mon,day)

    def walk(self):
        print("%s is walking"%self.name)

class Teacher(People):
    def __init__(self,name,age,year,mon,day,course):
        People.__init__(self,name,age,year,mon,day)
        self.course=course

    def teach(self):
        print("%s is teaching"%self.name)

class Student(People):
    def __init__(self,name,age,year,mon,day,group):
        People.__init__(self,name,age,year,mon,day)
        self.group=group

    def study(self):
        print("%s is studying"%self.name)
t1=Teacher("alex",28,1989,9,2,"python")
s1=Student("jack",22,1995,2,8,"group2")

これにより、先生t 1や学生s 1の名前、年齢などの特徴や歩く、教える、学ぶスキルを、前と同じ方法で呼び出すことができる.
print(t1.name)
t1.walk()
t1.teach()

出力:
alex    
alex is walking
alex is teaching

どうやって彼らの誕生日を知ることができますか?
print(t1.birth)

出力:
<__main__. class="hljs-built_in">Date object at 0x0000000002969550>

このbirthは子クラスTeacherが親クラスPeopleから継承したもので、親クラスPeopleのbirthはDateというクラスと組み合わせられているので、このbirthはオブジェクトです.Dateクラスの下にbirth_がありますinfoのスキルは、Dateの下のbirth_を呼び出すことができます.infoという関数の属性は先生t 1の誕生日を知っています.
t1.birth.birth_info()

結果は次のとおりです.
The birth is 1989-9-2

同様に、実例学生s 1の誕生日も同様の方法で知りたい:
s1.birth.birth_info()

結果は次のとおりです.
The birth is 1995-2-8

コンビネーションとは、1つのクラスで別のクラスに使用され、いくつかのクラスをつなぎ合わせることです.コンビネーションの機能も重複コードを減らすためです.