1.什么是继承
继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类
2.为什么要使用继承
继承的一方可以直接使用被继承一方的东西, 其目的是为了重用已经有的代码,提高重用性
语法: class 类名称(父类的名称): 类的内容 class Base: desc = '这是一个基类' def show_info(self): print(self.desc) def make_money(self): print('一天赚一个亿') class SubClass(Base): pass obj = SubClass() obj.make_money() # 一天赚一个亿 print(obj.desc) # 这是一个基类
3.抽象
抽象即抽取类似或者比较像的部分。
将多个子类中相同的部分进行抽取 ,形成一个新的类,这个过程也称之为抽象的过程
使用继承:先抽象在继承,继承一个已经现存的类, 然后扩展或是修改原始功能
抽取老师和学生中相同的部分形成person类 class Person: def __init__(self,name,age,gender): self.name = name self.age = age self.gender = gender def say_hi(self): print('name:%s,gender:%s,age:%s'%(self.name,self.age,self.gender)) class Teacher(Person): def teaching(self): print('老师教学生写代码') t1 = Teacher('jack','male',20) t1.say_hi() # name:jack,gender:male,age:20
class A: text = "haha" class B(A): text = "heihei" b = B() b.text = "xixi" print(b.text) # xixi
属性的查找顺序 对象自己的->所在类的->找父类->父类的父类->Object
4.派生
当子类添加自己新的属性或者在自己那里重新定义这些属性(不会影响到父类)也称之为覆盖,这个子类就称之为派生类,派生类指的是子类
class Person: def say_hi(self): print('hello') class Student(Person): def say_hi(self): print('hello world') stu = Student() stu.say_hi() # hello world
实现一个能够限制元素类型的列表类 class MyList(list): def __init__(self,element_type): super().__init__() # 调用父类的初始化,来完成基本的初始化 self.element_type = element_type def append(self,object): if type(object) == self.element_type: super(MyList,self).append(object) # 访问父类的append函数完成存储操作 else: print('sorry sir, you element type not is %s' % self.element_type) m = MyList(int) # 创建指定要存储的元素类型 m.append(1) print(m[0]) # 1 m.append('121212') # sorry sir, you element type not is <class 'int'>
5.子类访问父类的内容
语法:
方式一: super(当前类名称,self).你要调用父类的属性方法 方式二: supper().你要调用的父类的属性或方法 方式三: 类名称.你要调用的父类属性或方法 class Parent: test = 'abc' def say_something(self): print('anything') class Sub(Parent): def show_info(self): print(super().test) super().say_something() sub = Sub() sub.show_info() # abc anything
6.当继承一个现有的类,并且覆盖了父类的init方法时,必须在初始化init方法的第一行用super调用父类的初始化方法. 并传入父类所需的参数
# 为什么要在初始化方法中,调用父类的初始化方法 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): def __init__(self,name,gender,age,number): super().__init__(name,gender,age) self.number = number def say_hi(self): super().say_hi() print('number:%s'%self.number) stu = Student('rose','mael',20,'old01') # aa run stu.say_hi() # name:rose,gender:mael,age:20 number:old01
7.组合
将一个对象作为另一个对象的属性, 组合目的是重用代码
什么时候使用组合:如果两个类之间 没有太大的关系,完全不属于同类, 组合相比继承,耦合度更低了
class Phone: def __init__(self,price,kind,color): self.price = price self.kind = kind self.color = color def call(self): print('正在呼叫') def send_message(self): print('正在发送短信') class Student: def __init__(self,name,gender,phone): self.name = name self.gender = gender self.phone = phone def show_info(self): print("name:%s ,gender:%s"%(self.name,self.gender)) phone = Phone(1000,'apple','red') stu1 = Student('rose','male',phone) # 正在呼叫
菱形继承: python支持多进程, python3中任何类都直接或间接继承Object, object为这些类提供了很多常用的方法和属性,这样可以直接使用这些属性或方法
新式类:
经典类: 不是Object的子类 ,仅在python2中存在,Python2中如果声明继承object作为父类,就称为新式类
深度优先: 按照从左到右, 从下到上一直找到object为止
class A: pass class B: pass class C: pass class Test(A,B,C): pass print(Test.mro()) # [<class '__main__.Test'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class 'object'>] class A(object): pass print(A.mro()) # [<class '__main__.A'>, <class 'object'>] print(A.__dict__) # {'__module__': '__main__', '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}