面向对象有三大特性:封装,继承,多态
1.继承
1 .什么是继承: 继承是一种关系,再程序中,继承描述的就是类与类之间的关系,例如A继承了B,A就可以使用B已经存在的方法和属性,A就称为是B的子类,B也就是父类,也称为基类
2.继承的特点:继承的一方可以直接使用被继承一方已经有的方法和属性.可以重用已经有的代码.提高代码的重用性
3:继承语法格式:
class A: pass class B(A): # B类继承了A类 pass class C(B,A): # C类同时继承了B类与A类 pass
3.抽象. 再我们使用继承时不要盲目的去写要先进行抽象,抽象就是否将多个子类中相同的部分进行抽取,形成一个新的类,这个过程就时抽象
4.继承的使用流程: 1 先抽象再继承 2,继承一个已经存在的类,扩展或时修改原始的功能
5.属性的查找顺序: 先从对象自己本身找,然后再是自身所在类中,再找所在类的父类中查找.层层递进,最终层为Object,若找不到则报错
class A: num = 1 class B(A): num = 2 d = B() d.num = 3 print(d.num) # 3
class A: num = 1 class B(A): num = 2 d = B() print(d.num) # 2
class A: num = 1 class B(A): # num = 2 pass d = B() print(d.num) # 1
6.派生: 当一个子类中出现了与父类中不同的内容是,这个子类就称之为派生类,通常子类都会有一些新的代码.所以一般的子类都是派生类
7.覆盖: 当子类出现了和父类名称完全一致的属性或方法时.子类在定义这些相同的方法的时候就会父类的这些方法进行覆盖 也称为重写overrides
8.子类中访问父类的内容 通过super() 语法
方式1: super(当前类名称,self).你要调的父类的属性或方法 方式2: super().你要调的父类的属性或方法 方式3: # 与继承无关 类名称.你要调的父类的属性或方法(self)
注意: 当继承一个现有的类,并且覆盖了父类的__init__方法时,必须要在初始化方法的第一行调用父类的初始化方法,并传入父类所需的参数
9 : 练习,实现一个可以限制元素类型的列表
class MyList(list): def __init__(self): super().__init__() def append(self,name): if type(name) is str: print("不能是字符串") else: super().append(name) m = MyList() m.append('6666') print(m[0])
10: 组合: 组合是描述两个对象什么有什么的关系,当两个类之间没有太大的关系,完全不属于同类,如果我们使用继承就不符合正常逻辑了.这是我们又需要去访问令一个类中的方法或属性,这时候我们就可以使用组合,使用组合最终目的也是提高代码的复用性,降低代码的耦合度
class Phone: def __init__(self,kind,price): self.kind = kind self.price = price def call(self): print('拨号中') class Stu: def __init__(self,name,age,iphone): self.name = name self.age = age self.iphone = iphone def with_call(self): print('我要打电话') iphone = Phone('苹果',6000) s1 = Stu('小明',18,iphone) s1.iphone.call()