継承、組み合わせ

受け継ぎます

何継承されています

継承は関係ある2つのクラスに記述されているものとの間の関係は何ですか

例:マクダルは、ペイジは、豚は豚を実現することができますされています

プログラムでは、継承は、クラスとクラス間の関係を記述する

例:メソッドは、bが直接シュウ龍を既存ことができ、属性bを継承しました

それはサブクラスと呼ばれ、Bは、親クラス(クラスイル)と呼ばれています

なぜ使用の継承:

すでにいくつかのものを使用することができパーティー(サブクラス)を継承(プロパティとメソッド)は、直接の当事者(親)を継承しています

目的:改善既存のコードの再利用性を再利用します

どのように使用するには:

構文:

クラスのクラス名(親、親クラス名2、...の名前)
    のコードブロック
Pythonは、サブクラスの複数が同時に親クラスを継承します

 

例:

クラス燮:
    情報 = 燮から
    DEF マネー(セルフ):
         プリントマネー燮から
クラスのSub(燮):  サブ継承燮
    合格
OBJ = サブ()
親クラスの属性を呼び出すために、サブクラス
印刷を(obj.info)  燮の>>>から
#のサブクラスは親クラスのメソッドを呼び出す 
)(obj.money   燮マネーから>>>

 

要約:

用語集:具体的ではない、明確な、非常に漠然とした、読むことができません

抽象化のプロセス:

1クラス(プロパティまたはメソッド)、抽出複数の同一部分、

2.新しいクラスのこれらの同じ部分に、新しいクラスを作成します(新しいカテゴリのクラスが抽出されているクラス)

継承の適切な使用:

1.最初に抽象して、継承

2.既存のクラスを継承し、元の機能を拡張または変更

グラフィック:

例:ヒト:クラスの先生と生徒のクラスの同じ部分には名前、年齢、性別を持っている...、教師と生徒は、すべての人々が、あなたは新しいカテゴリを作成することができます

class Teacher:
    func = 'teach'
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender
​
    def say_hi(self):
        print('name:%s, age:%s, gender:%s'%(self.name, self.age, self.gender))
​
t = Teacher('haha', 20, 'male')
print(t.func)
t.say_hi()
​
​
class Student:
    func = 'play'def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender
​
    def say_hi(self):
        print('name:%s, age:%s, gender:%s' % (self.name, self.age, self.gender))
​
s = Student('xixi', 15, 'male')
print(s.func)
s.say_hi()
​
# 抽象后的到:
​
​
class Person:
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender
    def say_hi(self):
        print('name:%s, age:%s, gender:%s' % (self.name, self.age, self.gender))
​
​
class Teacher(Person):
    func = 'teach'
    def skill_training(self):
        print('教 Python 代码')
        
t = Teacher('haha', 20, 'male')
print(t.func)  # >>> teach
t.say_hi()  # >>> name:haha, age:20, gender:male
t.skill_training()  # >>> 教 Pythong 代码
class Student(Person):
    func = 'play'
​
s = Student('xixi', 15, 'male')
print(s.func)  # >>> play
s.say_hi()  # >>> name:xixi, age:15, gender:male

 

属性的查找顺序

对象自己 ---> 所在类 ---> 父类 ---> Object

class A:
    func = 'haha'
class B(A):
    func = 'xixi'
obj = B()
obj.func = 'hehe'
print(obj.func)  # >>> hehe

 

派生

当一个子类中出现了父类中不同的内容(属性或方法)时,这个子类就称之为派生类

通常子类都会写一些新的代码,不会和父类完全相同,即通常同时派生类

class sup:
    text = 20
    def func(self):
        print('hello')
class sub(sup):
    def auth(self):
        print('hello, world')

 

 

覆盖

也称之为重写 overrides

当子类中出现了与父类中 名称 完全一致的属性会方法

父类中被覆盖的属性会方法子类无法再调用,因为查找顺序:对象-->子类-->父类

class sup:
    text = 20
    def func(self):
        print('hello')
class sub(sup):
    # 覆盖父类中的func函数
    def func(self):
        print('hello, world')

 

练习 : 创建一个可以限制元素类型的列表*

# 把list当做父类,可以使用list中已经写好的代码,不需要再重新写
class MyList(list):
    def __init__(self, my_type):
        # 调用父类的初始化方法,来完成基本的初始化
        super().__init__()  # 因父类的init方法不需要参数,所以不用传参
        self.my_type = my_type
​
    def append(self, obj):
        '''
        :param obj:  要添加的元素
        :return: 没有返回值
        '''
        if type(obj) == self.my_type:
            # 调用父类(list)里的append方法,来完成真正的存储工作
            super(MyList, self).append(obj)
            # 也可用 super().append(obj)
        else:
            print('添加的元素类型与设定的%s类型不同'%self.my_type)
​
# 当你的需求是在创建对象时干点什么事,就该想到__init__初始化方法
m = MyList(int)  # 元素定义为 int 类型
m.append(2)
m.append(4)
m.append(6)
print(m)  # >>> [2, 4, 6]
print(m[1])  # 4
m.append('1')  # 添加的元素类型与设定的<class 'int'>类型不同

 

在子类中访问父类的内容

语法:

方式1:
   super(当前类名,self).要调用的父类的属性或方法
方式2:
   super().要调用的父类的属性或方法
   # 方式2 属于python3语法
方式3:
   父类名.要调用的父类的属性或方法(self)
   # 方式3余继承无关

注意(**)

当你继承一个现有的类,并且你覆盖了父类中的双下init方法时,必须在初始化方法的第一行调用父类的初始化方法,并传入父类所需要的参数

class Person:
    def __init__(self,name,gender,age,*args):
        self.name = name
        self.gender = gender
        self.age = age
        self.aa()  # 会执行此函数
def aa(self):
        print("aa run")
​
    def say_hi(self):
        print("name:%s ,gender:%s,age:%s" % (self.name,self.gender,self.age))
​
​
class Student(Person):
    # 覆盖父类的 __init__ 
    def __init__(self,name,gender,age,number):
        # 调用父类的 __init__ 并传参
        super().__init__(name,gender,age)
        self.number= number
​
    def say_hi(self):
        # 调用父类方法
        super().say_hi()
        print("numnber:%s" % self.number)
​
stu = Student("rose","mael",20,"01")
stu.say_hi()
>>>
aa run
name:rose ,gender:mael,age:20
numnber:old01

 


组合

组合是一种关系 : 描述两个类之间 什么有什么的关系

例 : 学生有手机,游戏角色有装备...

将一个类的对象作为另一个类的属性传入

什么时候使用继承: 分析两个类之间的关系,到底是不是 什么是什么的关系

什么时候使用组合: 分析两个类之间的关系, 没有太大的关系,完全不属于同类

组合比继承的耦合性更低

 

菱形继承

首先声明 Python 支持多继承 可以通过 子类名.mro() 查看父类的查找顺序,返回的是一个列表

新式类与经典类

python3中的任何类型都是直接或间接的继承Object

新式类: 任何显式或隐式地继承自Object的类就称之为新式类,python3中都是新式类

经典类:既不是Object的子类,仅在python2中出现

菱形继承时

1新式类,先查找深度,当遇到了共同的父类时就查找广度

2.经典类: 按深度查找

おすすめ

転載: www.cnblogs.com/waller/p/11247101.html
おすすめ