オブジェクト指向の継承の特徴

オブジェクト指向の三つの特徴

受け継ぎます

パッケージ

ポリモーフィズム

受け継ぎます

まず、何が継承されています

継承は、新しいクラスを作成する方法である新しいクラスが1つまたは複数の親クラス(Pythonのサポート多重継承)を継承することができ、親クラスは、基本クラスまたはスーパークラスと呼ばれることができ、新しいクラスを派生クラスまたはサブクラスと呼ばれています。プロパティと、親クラス、サブクラスのメソッド。

フォーマットは、括弧内のサブクラス名で、ブラケットは、親クラスの名前です。

class A:
    pass

class B(A):  # B就继承了A
    pass

ここでの違いは、新しいクラスと古典的なクラスに言及します

新しいクラス:継承されたオブジェクトクラス限りは、新しいクラスは、のpython3では、デフォルトでは新しいスタイルのクラスです

python2では、ディスプレイを指定する必要がOBJECを継承する新しいクラスです

クラシック:python2では、何の継承オブジェクトクラスが存在しない古典的なクラスであります

python3なしクラシック

第二に、クラスの継承は、単一および多重継承に分かれています

class A(object):
    pass
class B(A):
    pass
#  B继承了A这个类,单继承

class C(A,B):
    pass
# C继承了A和B,多继承

他の組み込み属性の:__名字__

print(B.__dict__) # 类的属性和方法

print(B.__name__) # 类名

print(B.__bases__) # 类的父类

プロパティを見つけるために==継承:==

まず---オブジェクトには、「サブカテゴリ検索を---」見て親クラスを見つけるために(そして、多重継承の親クラスを見つけるための最初の親から始めて、左から右へ)---「親クラスを見つけるために与えられたよりも少ないです

第三に、継承を使用すると、コードの冗長性を削減します

# 这里首先利用面向对象写一个老师和学生的类,他们的基类都是人
# 这里不用继承
class Person:
    school = 'oldboy'

class Teacher(Person):
    def __init__(self,name,age,level):
        self.name=name
        self.age=age
        self.level=level

class Student(Person):
    def __init__(self,name,age,course):
        self.name=name
        self.age=age
        self.course=course
# 以上代码老师和学生的类都有共同属性:name和age,那就可以把这两个属性放到人的类中,然后老师和学生的类来继承人的类

class Person(object):
    school = 'oldboy'
    def __init__(self, name, age):
        self.name = name
        self.age = age

class Teacher(Person):
    pass

class Student(Person):
    pass

# 这样就减少了代码的冗余


注意:サブクラスのインスタンスが自動的に起動する__init__、親を探しに行くでしょうサブクラスではない場合は、この方法を、親クラスは、いくつかのパラメータを渡す必要がありますいくつかのパラメータを持っています

第四に、複数の層および多重継承

# 多层继承:一层一层的继承下去
class A:
    a="AAAA"
    
class B(A):
    a="BBB"

class C(B):
    a="CCC"
    pass

class D(C):
    a = "DDD"
    pass
# 多继承 
class A:
    a="AAAA"
    
class B:
    a="BBB"

class C:
    a="CCC"
    pass

class D(A,B,C):   # 类 D 继承了上面多个类
    a = "DDD"
    pass
# 多继承的多层
class A:
    a="AAAA"
    
class B(A):
    a="BBB"

class C(B):
    a="CCC"
    pass

class D(A,B,C):
    a = "DDD"
    pass

V.継承されたプロパティの検索順序

5.1ダイヤモンドの問題

ダイヤモンド継承の問題(クラスの表示がないオブジェクトクラス、継承されている):検索新しいクラスの順序とクラシックは同じではありません。

新しいクラス(すべての新しいスタイルクラスでPY3):最初の広---左からは、(ダイヤモンド形の頂点を含まない)頂点最後にダイヤモンドを見つけるまで探して、親クラスを継承し、次へ進み見上げてきた、見つかりましたダイヤモンド(ダイヤモンド形の頂点を含まない)頂端部、及び最終的には、ダイヤモンドの頂点を発見しました。

クラシック(のみPY2中のみ):---深さ優先、左から、ダイヤモンドの頂点を見つけるまで探して親の下に継承していき(ダイヤモンド頂点を含む)の頂点最終的にダイヤモンドを見つけるまで探してきましたエンド(固定小数点ダイヤモンドが含まれていません)。

ダイヤモンドの問題は発生しません:通常の検索を

#继承的菱形问题:新式类和经典类的查找顺序是不一样的
#新式类的查找属性:广度优先
#经典类:深度优先

class G(object):
    a = "GGG"
    pass
class F(G):
    # a = "FFF"
    pass
class E(G):
    # a = "EEE"
    pass
class D(G):
    # a = "DDD"
    pass
class C(F):
    # a="CCC"
    pass
class B(E):
    # a="BBB"
    pass
class A(B,C,D):
    # a="AAAA"
    pass

a=A()
print(a.a)

上記のコードは、新しいクラスのダイヤモンドの問題を表示され、幅優先探索順序は次のとおりです。

IMG

ダイヤモンドの古典的な問題、深さ優先探索順序は次のとおりです。

IMG

5.2によると、mroルックアップリスト

MRO == ==リスト、(唯一の新しいクラスで)リストを見つける承継のため

print(A.mro())
print(A.__mro__)
#  两种方式都可以

第六に、再利用継承された親クラスのメソッドは、次の2つの方法があります

6.1方法:継承して、名前を命名の使用とは無関係の

# 父类中object写与不写,在py3中没有区别,
# 有的人在py3中这么写,为了向下兼容
# 调用父类方法的第一种方式 :指名道姓的方式,跟继承关系无关
class Person(object):
    def __init__(self,name,age):
        self.name=name
        self.age=age

def init_1(self,name,age):
    self.name=name
    self.age=age

class Student:
    school = 'yyyy'
    
    def __init__(self,name,age,course):
        Person.__init__(self,name,age)    #指名道姓的使用Person的__init__方法,Preson中有三个参数就必须传三个
        init_1(self,name,age)
        self.course=course

stu=Student('nick',19,'python')
print(stu.name)

superキーワードを通じて、相続に関連:6.2二番目の方法

class Person(object):
    def __init__(self,name,age):
        self.name=name
        self.age=age

class Student(Person):
    school = 'yyyy'
    def __init__(self,name,age,course):
        #super()相当于得到了一个特殊对象,第一个参数不需要传,调用绑定方法,会把自己传过去
        ##########    self不需要传,不需要传
        super().__init__(name,age)
        #看到别人这么写:super(类名,对象)  在py3中为了兼容py2
        #在py3中这么写和省略写法完全一样
        #在py2中必须super(Student,self)写
        # super(Student,self).__init__(name,age)
        self.course=course

stu=Student('nick',19,'python')
print(stu.name)
print(stu.age)
print(stu.course)

6.3概要

そこの時間の継承、通常はスーパーキーワードの方法。

以下の例では、名前で使用される方法:

  • いいえ相続ん
  • あなたは見つけるために、複数の親クラス、スーパーに従ってのMROのリストを継承する場合は、ここで親クラスのメソッドのいずれかを使用して名前を名前を付けたい、我々は、使用の名前を命名する必要があります

おすすめ

転載: www.cnblogs.com/zhuangyl23/p/11420981.html