受け継ぎます
何継承されています
継承は関係ある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中出现
菱形继承时
2.经典类: 按深度查找