面对对象的三大特性之继承

1.什么是继承?

在程序中,继承指的是class与class之间的关系

继承是一种关系,必须存在两个class才能产生这种关系;被继承的class称为父类,继承的class称为子类。

2.为什么要使用继承?

现实中,通过继承,子可以直接使用父的内容。

在程序中,通过继承,子类可以直接使用父类已有的代码

3.如何使用继承

#继承的定义
class Father1:
x = 13
print('这是父类的x', x)
def coding(self):
print('我是父类的对象的绑定方法coding')
@classmethod
def missing(cls):
print('这是父类的绑定方法missing')
class Father2:
y = 14
print('这是父类Father的y', y)
class Son(Father1, Father2):
pass

print(Son.x)
print(Son.y)
son1 = Son()
Son.coding(son1)
Son.missing()
son1.missing()


###输出结果
13
14
我是父类的对象的绑定方法coding
这是父类的绑定方法missing
#1.命名方式:
在子类中类名加上括号,加上父类的名称即可
#2.在python中,一个子类可以有多个父类,多个父类在括号中用逗号隔开,这一点在其他语言中是不支持的。
#3.子类中的对象可以访问父类的属性和方法。
#4.子类可以调用父类的绑定方法

4.抽象

抽象:就是抽取公共的父类的方法

抽象的作用:抽取多个类中相同的方法和属性形成一个新的类

#应用如下:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def eating(self):
print('%s要吃饭' % self.name)
def sleeping(self):
print('%s要睡觉' % self.name)

class Child(Person):
def crying(self, mom):
print('%s今年%s岁会哭着找妈妈%s' % (self.name, self.age, mom.name))

class Adult(Person):
def working(self, papa):
print('%s会找老公%s' % (self.name, papa.name))

xiaoming = Child('xiaoming' , 2)
mom = Adult('jessic', 28)
papa = Adult('egon', 30)
xiaoming.crying(mom)
mom.working(papa)
xiaoming.eating()
xiaoming.sleeping()

###输出结果
xiaoming今年2岁会哭着找妈妈jessic
jessic会找老公egon
xiaoming要吃饭
xiaoming要睡觉

#总结:
1.通过继承,避免了重复代码的书写
2.通过抽象,避免了继承一些不该有的方法和属性
3.写继承时应该先抽象再继承
4.在抽取过程中,可能会有一些跟业务需求无关的类这是正常的,这些称为公共父类。
5.公共父类的作用是储存多个子类相同的属性和方法

5.派生

派生指的是子类继承父类,并且拥有自己独特的属性或技能,该子类称为派生。派生类一定是子类。

#为什么有派生类?
#因为子类可能有自己独特的属性需要添加
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def say_hi(self):
print("hello my name is %s,i'm %s years old" % (self.name, self.age))

class Student(Person):
def __init__(self, name, age, adress):
self.name = name
self.age = age
self.adress = adress
def attend_class(self):
print('%s家在%s,%s岁,要好好学习' % (self.name, self.adress, self.age))

daidai = Student('daidai', 26, 'china')
daidai.say_hi()
daidai.attend_class()
hello my name is daidai,i'm 26 years old
daidai家在china,26岁,要好好学习

#Student就是一个派生类

6.子类访问父类的方法和属性

在派生中,相同的初始化属性,相同部分写了重复代码

有两种方式可以让子类访问父类的方法和属性

class Student(Person):
def __init__(self, name, age, adress):
#第一种调用方式:在子类中重用父类方法。这种调用方式与继承关系无关
Person.__init__(self, name, age)
self.adress = adress def attend_class(self):
print('%s家在%s,%s岁,要好好学习' % (self.name, self.adress, self.age))

daidai = Student('daidai', 26, 'china')
daidai.say_hi()
daidai.attend_class()

###2.
class Student(Person):
def __init__(self, name, age, adress):
#第二种调用方式:利用super()
#super()表示创建一个特殊对象,可用于调用父类
super().__init__(name,age)
# Person.__init__(self, name, age)
self.adress = adress
def attend_class(self):
print('%s家在%s,%s岁,要好好学习' % (self.name, self.adress, self.age))

daidai = Student('daidai', 26, 'china')
daidai.say_hi()
daidai.attend_class()

##了解
在python2中,super()的使用方法有所不同,需要写成:
super(Student, self).__init__(name, age)
#其中Student表示父类,self表示是对象本身

7.继承后子类的属性查找

class S:
x = 1

class A(S):
x = 2

class B(A):
x = 3

b = B()
b.x = 4
print(b.x)

子类对象和对象的查找方法的查找顺序:
对象——>B(子类)——>A(父类)——>S(父类)

#如果一个子类有多个父类时查找顺序
#1.如果父类不存在自己的父类时,按照继承的顺序去查找BASC
#2.如果父类还有自己的父类时,则按照继承顺序沿一条线找到底(深度查找)
#3.如果存在两层关系还有公共关系时,会按照广度优先原则查找,也就是最后一层不会先找,先按照深度原则找完父类,然后再找父类的公共类
class C:
x = 5
class S:
x = 1

class A:
x = 2

class B(A, S, C):
x = 3

b = B()
b.x = 4
print(b.x)


#注意:
1.在经典类中,属性的查找只按照深度查找原则
2.只有在python2中才有经典类

8.经典类和新式类

所有直接继承或者间接继承object的类,都是新式类,object称之为根类,意思时所有类都是源自object类

  • 为什么这么设计?

    创建对象时,需要申请内存空间,创建新的名称空间,将对象的属性放入名称空间,这一复杂的基础操作都是由object完成的。简单来说就是object提供了一些常用的基础操作

注意:

1.在python3中,所有类都是object的子类,所有类都是新式类

2.在python2中,默认的是经典类,不会继承object

#区别
#python3中定义类
class Cls():
print('python3中定义类') #python2中
class Cls(Object):
print('python2中定义类')
  • ——base——的作用

    class Cls():
    print('python3中定义类')
    Cls.__base__

    #Cls.__base__用于查看父类


    Cls.mor()
    .mor()显示属性列表

python中类与对象之继承的更多相关文章

  1. python中类与对象的命名空间(静态属性的陷阱)、__dict__ 和 dir() 在继承中使用说明

    1. 面向对象的概念 1)类是一类抽象的事物,对象是一个具体的事物:用类创建对象的过程,称为实例化. 2)类就是一个模子,只知道在这个模子里有什么属性.什么方法,但是不知道这些属性.方法具体是什么: ...

  2. python day18--面向对象,继承

    # class Animal: # breath = '呼吸' # # def __init__(self, name, sex, age): # self.name = name # self.se ...

  3. python中类与对象及其绑定方法的定义

    面向对象编程 什么是面向对象? 面向过程:将需要解决的问题按步骤划分,一步一步完成每一个步骤,而且          步骤之间有联系. 优点:复杂问题可以分步完成 缺点:扩展性很差,维护性差.如果中间 ...

  4. Python 之类与对象及继承

    类与对象 学习类的语法 关键字 class 类别,分类class 类名:属性特性特征类名的编写规范:首字母大写 驼峰命令 见名知意--->遵守规范.Math StudentInfoclass S ...

  5. Python中类和对象在内存中是如何保存?

    类以及类中的方法在内存中只有一份,而根据类创建的每一个对象都在内存中需要存一份,大致如下图: 如上图所示,根据类创建对象时,对象中除了封装 name 和 age 的值之外,还会保存一个类对象指针,该值 ...

  6. day 17python 面对对象之继承

    一:什么面向对象的继承? 比较官方的说法就是: 继承(英语:inheritance)是面向对象软件技术当中的一个概念.如果一个类别A“继承自”另一个类别B,就把这个A称为“B的子类别”,而把B称为“A ...

  7. 一文讲全了Python 类和对象内容

    摘要:这是一个关于 Python 类和对象的全部内容. 本文分享自华为云社区<从零开始学python | Python 类和对象-面向对象编程>,原文作者:Yuchuan  . Pytho ...

  8. 第7.6节 Python中类的继承机制详述

    在本章第一节,介绍了面向对象程序设计的三个特征:封装.继承和多态,前面章节重点介绍了封装和多态,由于Python语言是多态语言,对象的类型不再由继承等方式决定,而由实际运行时所表现出的具体行为来决定, ...

  9. python中类的继承

    python中类的继承 在python中面向对象编程中实现继承,以下面一个实例进行说明. class SchoolMenber(): # __init__类似于c++中的构造函数 # __init__ ...

随机推荐

  1. oracle 查看字段说明

    SELECT    *FROM    all_col_commentsWHERE    table_name = UPPER ('t_bn_background')AND OWNER = 'VTER' ...

  2. 将100道计算题输出至txt文件,再读取文件至控制台,在控制台中输入答案并评判对错

    我在课堂上基本完成了输出100道题和创建文档,但是因为对输入输出流不熟悉,所以并没有实现将输出的计算题导出到文档里,在课下我又请教了宿舍的大佬,基本完成如下: 源代码: import java.io. ...

  3. 1.python+appium环境配置

    环境部署 本博客以32位的Windows 7操作系统为例介绍Appium+Python的环境搭建步骤 1.安装Node.js 访问 https://nodejs.org/en/download/,下载 ...

  4. 官网下载MySQL最新版本的安装包

    下载地址:http://www.mysql.com/downloads/ 1.选择下载社区版本 MySQL Community Edition (GPL)Community (GPL) Downloa ...

  5. AFN\HTTPS\UIWebView

    1.AFN使用技巧 1.在开发的时候可以创建一个工具类,继承自我们的AFN中的请求管理者,再控制器中真正发请求的代码使用自己封装的工具类. 2.这样做的优点是以后如果修改了底层依赖的框架,那么我们修改 ...

  6. Centos上SSH连接过慢原因

    最近发现机房里有些centos机器进行ssh登陆非常慢且会超时,经过查看发现时GSPI认证过慢问题造成: 使用 ssh -v 发现 debug1: SSH2_MSG_SERVICE_ACCEPT re ...

  7. 《从Lucene到Elasticsearch:全文检索实战》学习笔记一

    今天,我主要给大家讲一下信息检索概念. 信息检索: 互联网时代的飞速发展使人们进入了信息爆炸时代,据统计全球的互联网用户已达到30亿,在各个网站及移动app在每个分钟 产生的数据量是巨大的,从而导致数 ...

  8. jsp案例--展示数据库中的数据

    一.什么是jsp? JAVA SERVER PAGES java的动态网页,servlet用来获取数据处理业务,擅长处理与java代码有关的内容.jsp展示数据,擅长处理与html有关的内容. 二.如 ...

  9. cookie和session的关联关系

  10. python之路——7

    王二学习python的笔记以及记录,如有雷同,那也没事,欢迎交流,wx:wyb199594 复习 1. 小数据池 int -5---256 str 特殊字符 *202. ASCII码 8位 1字节 - ...