继承
什么是继承??
继承是一种关系,描述的是两个对象之间 什么是什么的关系
在生活中例如王健林很有钱 但是王思聪开始是没有钱的 因为他爸是王健林 他继承了他爸的钱 所以他也有了钱.
在程序中呢 描述的是类与类之间的关系,例如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) 是一个打印出类的继承顺序