23日目高度なオブジェクト指向

高度なオブジェクト指向

クラスの継承

何継承されています

  • 継承は、道の新しいタイプです、新しいクラスをサブクラスと呼ばれ、クラスが継承された親クラスと呼ばれています
  • 親クラス、サブクラス(派生クラス)の中のpythonは、親クラスとサブクラスは唯一の時間が生成されます継承します
  • 継承は、親クラスのプロパティを取得することです

なぜ使用の継承

  • 統合は、コードの冗長性を減らすことができます

継承されたオブジェクトの

  • Pythonのサポートは、サブクラスは、複数の親クラスを継承しますが、使用はお勧めしません機能と機能の間で混乱になり、あなたがより多くを継承する場合、複数の親クラスを継承し、それがその承継をお勧めします
  • python3クラスがどのクラスを継承していない場合、デフォルトのオブジェクトクラスの継承
  • python2クラスがどのクラスを継承していない場合は、オブジェクトのクラスを継承することはありません

オブジェクト属性の検索順序

まずオブジェクト自体、およびそのオブジェクトのクラスの後、親、親クラスは、オブジェクトクラスを知っています

派生クラス

新しいプロパティは、親クラスのすべての属性を継承し、サブクラス定義を導出します

方法:関数は、継承に依存しない方法で、名前でクラスにアクセスするには

class Animal():
    def __init__(self, height, weight):  
        self.height = height  
        self.weight = weight  

    def jiao(self):
        print(self.__class__.__name__, '叫')
        
class People(Animal):
    def __init__(self, name, age,height,weight):
        Animal.__init__(self,height,weight)
        self.name = name
        self.age = age

    def read(self):
        print('read')
        
p1=People('nick',18,180.140)
print(p1.__dict__)

方法2:派生

  • プロパティ関係を継承するために厳密に検索
  • スーパー()あなたは親クラスにアクセスするために、特別な(継承関係に応じて)に設計されたオブジェクトプロパティを取得します
  • スーパーの完全な使用は)python2に記載されたフルを必要とし、2つのpython3スーパー(と略記することができ、(自己、独自のクラスに名前を付ける)スーパーです
class OldBoyPeople:
    school='oldboy'
    
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
        
class OldBoyStudent(OldBoyPeople):
    def __init__(self,name,age,sex,stu_id):
        super().__init__(name,age,sex)
        self.stu_id=stu_id
    def choose_course(self):
        print(f'{self.name} is choosing course')
        
stu1=OldBoyStudent('nick',19,'male','001')

クラスの組み合わせ

これは、オブジェクト・クラスの組み合わせが一つの属性を含むオブジェクトの属性値は、別のクラスを指しています

組み合わせは、クラスのコードの冗長性の問題の間で解決するために使用されます

class People:
    def __init__(self,name,sex):
        self.name=name
        self.sex=sex

    def eat(self):
        print(f'{self.name}开始吃')

class Student(People):
    def __init__(self,id,name,sex):
        super(Student, self).__init__(name,sex)
        self.id=id

    def choose_course(self,course):
        self.course=course      #相当于student派生一个course属性,该属性引用外部传入的course也就是Course生成的对象
        print(f'{self.name}选择了课程{course.name}')

class Teacher(People):
    def __init__(self,level,name,sex):
        super(Teacher, self).__init__(name,sex)
        self.level=level

    def scored(self,student,course,score):
        print(f'{self.name}给学生{student.name}的课程{course.name}打{score}分')

class Admin(People):
    def create_course(self,name,price):
        course=Course(name,price)
        print(f'管理员{self.name}创建了课程{name}')
        return course


class Course:
    def __init__(self,name,price):
        self.name=name
        self.price=price



st1=Student('01','zhujian','male')
st2=Student('02','tom','male')
print(st1.__dict__)
print(st2.__dict__)

t1=Teacher('1','nick','male')
print(t1.__dict__)

a1=Admin('egon','male')
print(a1.__dict__)

linux=a1.create_course('linux',6666)
python=a1.create_course('python',8888)

st1.choose_course(python)
st2.choose_course(linux)

t1.scored(st1,python,'96')
t1.scored(st2,linux,'95')

ダイヤモンド継承の問題

分類クラス

  1. 新しいクラス
  • 継承されたクラスやオブジェクトのクラスのサブクラスでは、新しいクラスです
  • すべてのクラスは、新しいクラスのpython3です
  1. クラシック
  • オブジェクトのクラスのクラスとサブクラスを継承するのではなく、クラシックです
  • 唯一のクラシックでのみpython2

ダイヤモンド継承の問題

継承はダイヤモンド形の構造である場合は、その親のサブクラスは、最後の同じクラスを継承していますので、2つの方法でプロパティを探します。

  • クラシック:深さ優先:最後に移動するための方法最初の親のサブクラスで始まる最後のサブクラスは親を継承するまで、あなたが探して起動する場合は、探し始めるが第二の親サブクラスから見つかりませんでした。 (ただし、最後の親を見つけることができません)、そして第三は、親クラスのサブクラスで、あなたが希望の属性を見つけるまで、第四の親であります
  • 新しいカテゴリ:幅優先:直接第二の親のサブクラスで、その後、最後の継承は、親クラスをスキップし、探し始めるために、親クラスのサブサブクラスで始まる、最後の親クラスを継承して見ていない、第三最後の親になるまで、その後、親の決勝を継承し、彼らのために見に行きます

通常の継承は、通常のシーケンシャル検索によるものです

多型と多型

ポリモーフィズム

多型は、物事のクラスに様々な形をしている(複数のサブクラス抽象クラス、ひいては多型継承の概念に依存します)参照します

ポリモーフィズム

ポリモーフィズムを使用すると、異なるコンテンツの関数の関数名を呼び出すために使用できるように、異なる機能を持つ関数は、同じ関数名を使用することができることを意味します

おすすめ

転載: www.cnblogs.com/masterjian924/p/11056499.html