面向对象的继承

继承

什么是继承??

继承是一种关系,描述的是两个对象之间 什么是什么的关系

在生活中例如王健林很有钱 但是王思聪开始是没有钱的 因为他爸是王健林 他继承了他爸的钱 所以他也有了钱.

在程序中呢 描述的是类与类之间的关系,例如a继承了b 那么a就有b的特征 也就是a 能直接使用b已经存在的方法和属性 那么a称为 子类 ,b就是a的父类 也叫超类 和 基类

那么为什么要使用继承呢???

继承可以直接使用被继承 已存在的属性和方法 (目的是为了 减少代码的冗余 重用已经有了的代码 提高重用性)

如何使用继承??

# 语法
class 类名称1: 
    name = '我是父类'

# 定义子类
class 类名称2(类名称1):
    pass
# 在python中 一个子类可以同时继承多个父类
# 如果你想调用 父类的 属性 那么 就和你掉 自己属性的语法是一样的
res = 类名称2()
print(res.name)
>>> '我是父类'

那么! 假如说 我子类中也有一个和父类一样的属性 或者 函数 那么 他会执行那个?
class 类名称2(类名称1):
   name = '我是一个子类'

# 查找顺序 如果自己有的话 就不和(老爸)父类 要了 如果没有 那么在找他要
# 假如说 我一共有三个类 a 继承 b   b继承c  c继承d   那么a没有就会去b找 b没有的话就会去d找
属性的查找顺序 
class A:
    text = "haha"

class B(A):
    text = "heihei"
    pass

b = B()
b.text = "xixi"

print(b.text)
先是对象自己的 然后 在类中找  不在就去父类中找....
对象自己的 - > 所在类中 -> 找父类 - >父类的父类 ->Object
 

什么是抽象?

抽象就是 不具体的 很模糊的 看不懂的 他是一个将多个子类中相同的部分 进行抽取 形成一个新的类 这个过程就是抽象!

例如

# 有一个 类 是 老师和学生 
class Teather:
    def __init__(self, name ,age):
        self.name = name
        self.age = age 
    def 技能(self):
        print('我会教书')
 class Student:
    def __init__(self, name ,age ,num ):
        self.name = name
        self.age = age 
        self.num = num
    def 技能(self):
        print('我会打游戏')
 # 他们都有公共的属性和方法 可以使用继承是吧,但是!  学生继承老师是不是很扯?凭什么继承他的名字?我会教书吗?对吧  所以 就需要使用抽象来创建一个新的类  因为 老师 和 学生 都有公共的属性 那么 我能不能定义一个人的类?? 然后 老师 和同学在继承人这个类???
class Person:
    def __init__(self, name ,age):
        self.name = name 
        self.age = age
        
class Teather(Person):
    def 技能(self):
        print('老子会教书')
class Student(Person):
    def 技能(self):
        print('老子会打游戏') 

派生

哈哈 ,那么什么又是派生呢?python??不不不 其实派生就是 当一个子类出现了与父类不同的内容时 这个子类就称之为派生 通常会写一些新的代码 不可能和父类一模一样 ,所以派生列必须是子类

覆盖

什么是覆盖呢???哈哈哈 其实覆盖可以称为重写 英文单词 overrides

当子类出现一个和父类名称完全一致的属性或者是方法 就是 覆盖

子类中访问父类的内容

语法(********)

方式1:
super(当前类名称,self).你要调的父类的属性或方法
方式2:
super().你要调的父类的属性或方法
方式3:
类名称.你要调的父类的属性或方法(self)  
#方式3与继承无关
# 这仅仅只是 子类访问父类的内容的方法

#### 强调在强调:

当你继承一个现有的类,并且你覆盖了父类的init方法时,必须在初始化方法的第一行调用父类的初始化方法,并传入父类所需的参数 
例如:
class Person:
    def __init__(self, name ,age):
        self.name = name 
        self.age = age
     def index(self):
        print('洗刷刷')
        
class Teather(Person):
    def __init__(self,name):
        super().index()
        self.name = name

组合

组合 是一种关系 描述两个对象之间 什么有什么的关系 例如 学生有电脑 老师有手机 游戏有装备

他是将一个对象作为另外一个对象的属性 (就是什么有什么)

class Phone:
    def __init__(self,price,kind,color):
        self.price = price
        self.kind = kind
        self.color = color

    def call(self):
        print("正在呼叫XXXX;")

    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)
stu1.phone.call()


##### 组合的目的:

也是为了重用现有代码


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

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

另外组合相比继承,耦合度更低了 

了解知识点
## 菱形继承
首先明确python支持多继承
##### 补充:新式类与经典类
python3中任何类都是直接或间接继承了Object 
新式类,任何显式或隐式地继承自object的类就称之为新式类, python3中全都是新式类  
经典类,既不是Object的子类 ,仅在python2中出现  
当出现了菱形继承时,新式类,先深度,当遇到了共同父类时就广度 
新式类,就是深度优先

print(C.mor) 是一个打印出类的继承顺序

1564072585171

趁自己还没死 多折腾折腾
原文地址:https://www.cnblogs.com/lddragon/p/11267387.html