面向对象介绍

一、面向对象和面向过程
面向过程:核心过程二字,过程即解决问题的步骤,就是先干什么后干什么
基于该思想写程序就好比在这是一条流水线,是一种机械式的思维方式
优点:复杂的过程流程化
缺点:扩展性差

面向对象:核心是对象二字,对象指特征与技能的结合体
基于该思想编写程序就好比在创造一个世界,世界是由一个个对象组成,是一种‘上帝式’的思维方式
优点:可扩展性强
缺点:变成复杂度高,极容易出现过度设计的问题

2、类
对象是特征与技能的结合体,类就是一系列对象相似的特征与技能的结合体
在现实生活中:一定是先有一个个具体的对象,后总结出类
在程序中:一定是先定义类,后产生对象
#类体代码在类的定义阶段就会立刻执行
class Students:
school = '宏福教育'
def run(self):
# return 'running......'
print('running....')
stu1 = Students()
stu2 = Students()
stu3 = Students()
print(Students.school)#数据属性 
print(Students.run)#函数属性

print(stu1.school)#查询属性
stu1.contry = '中国'#添加属性
del stu1.contry#删除类属性
stu1.school = '宏福'#修改属性
#实例化出不同属性的对象
class Students:
school = '宏福教育'
def __init__(self,name, age, job):
self.name = name
self.age = age
self.job = job
def run(self):
# return 'running......'
print('running....')
stu1 = Students('张三', 18, 'IT')
stu2 = Students('王二', 16, 'student')
stu3 = Students('赵五', 19, 'teacher')

 封装

封装案例1.

  01、封装

    1.封装是面向对象一大特点

    2.面向对象编程的第一步--将属性和方法封装到一个抽象的类当中

    3.外界使用类创建对象,然后让对象调用方法

    4.对象方法的细节都被封装在类的内部

  02、小明爱跑步

    需求

    1.小明体重75公斤

    2.小明每次跑步都会减肥0.5公斤

    3.小明每次吃东西体重会增加1公斤

    

    

class Person:
def __init__(self, name, weight):
self.name = name
self.weight = weight
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> run(self):
self.weight </span>-= 0.5 <span style="color: #0000ff;">def</span><span style="color: #000000;"> eat(self):
self.weight </span>+= 1 <span style="color: #0000ff;">def</span> <span style="color: #800080;">__str__</span><span style="color: #000000;">(self):
</span><span style="color: #0000ff;">return</span> <span style="color: #800000;">'</span><span style="color: #800000;">名字:%s\n体重:%s\n</span><span style="color: #800000;">'</span> %<span style="color: #000000;"> (self.name, self.weight)

xm = Person('小明', 75)

xm.eat()

xm.run()

print(xm)

#当使用print输出对象的时候,只要自己定义了__str__(self)方法,那么就会打印从在这个方法中return的数据

封装案例2

  需求:

    1、房子有户型、总面积、家具名称列表

      房子没有任何家具

    2、家具有名字和占地面积,其中

      席梦思(bed):4平米

      衣柜(chest): 2平米

      餐桌(table): 1.5平米

    3、将以上3个家具添加到房子中

    4、打印房子中,要求输出:户型、总面积、剩余面积、家具名称列表

class Items(object):
def __init__(self, name, area):
self.name = name
self.area = area
</span><span style="color: #0000ff;">def</span> <span style="color: #800080;">__str__</span><span style="color: #000000;">(self):
</span><span style="color: #0000ff;">return</span> <span style="color: #800000;">'</span><span style="color: #800000;">家具名称:%s\n占地面积:%s\n</span><span style="color: #800000;">'</span> %<span style="color: #000000;"> (self.name, self.area)

class House(object):

def init(self, house_type, total_area):

self.house_type = house_type

self.total_area = total_area

self.free_area = total_area

self.items = []

</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> add_item(self, item):
self.free_area </span>= self.free_area -<span style="color: #000000;"> item.area
self.items.append(item.name) </span><span style="color: #0000ff;">def</span> <span style="color: #800080;">__str__</span><span style="color: #000000;">(self):
</span><span style="color: #0000ff;">return</span> <span style="color: #800000;">'</span><span style="color: #800000;">房子类型:%s\n房子总大小:%s\n房间剩余面积:%s\n家具列表:%s\n</span><span style="color: #800000;">'</span> %<span style="color: #000000;"> (self.house_type, self.total_area, self.free_area, self.items)

bed = Items('席梦思', 10)

chest = Items('餐桌', 5)

house = House('两室一厅', 100)

house.add_item(bed)

house.add_item(chest)

print(house)

封装案例3:

    属性可以是另外一个类创建的对象:

    

class Gun:#创建枪类
def __init__(self,gun_type):
self.gun_type = gun_type#初始化枪的型号
self.bullet = 0#初始化子弹的数量
<span style="color: #0000ff;">def</span> add_count(self, count):<span style="color: #008000;">#</span><span style="color: #008000;">添加子弹</span>
self.bullet +=<span style="color: #000000;"> count </span><span style="color: #0000ff;">def</span> shoot(self):<span style="color: #008000;">#</span><span style="color: #008000;">射击</span>
<span style="color: #0000ff;">if</span> self.bullet &gt; 0:<span style="color: #008000;">#</span><span style="color: #008000;">假如子弹数量大于0</span>
self.bullet -= 1<span style="color: #008000;">#</span><span style="color: #008000;"> 那就射击,并且减少子弹数量</span>
<span style="color: #0000ff;">print</span>(<span style="color: #800000;">'</span><span style="color: #800000;">开火.......%s</span><span style="color: #800000;">'</span> %<span style="color: #000000;"> self.bullet)
</span><span style="color: #0000ff;">else</span><span style="color: #000000;">:
</span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">'</span><span style="color: #800000;">没有子弹啊,兄弟,别这么坑我啊???</span><span style="color: #800000;">'</span>)<span style="color: #008000;">#</span><span style="color: #008000;">否则没有就显示没有子弹</span>

class Soldier:#创建一个士兵的类

def init(self, name,gun=None):

self.name = name#初始化士兵的姓名

self.gun = gun#初始化枪

<span style="color: #0000ff;">def</span> fire(self):<span style="color: #008000;">#</span><span style="color: #008000;">开火方法</span>
<span style="color: #0000ff;">if</span> self.gun:<span style="color: #008000;">#</span><span style="color: #008000;">假如有枪</span>
self.gun.shoot()<span style="color: #008000;">#</span><span style="color: #008000;">那就射击</span>
<span style="color: #0000ff;">else</span>:<span style="color: #008000;">#</span><span style="color: #008000;">不然就显示没有枪</span>
<span style="color: #0000ff;">print</span>(<span style="color: #800000;">'</span><span style="color: #800000;">没有枪啊,兄弟,你让我去送死吗??</span><span style="color: #800000;">'</span><span style="color: #000000;">)

ak47 = Gun('AK47')#创建一个枪的对象叫ak47

ak47.add_count(10)#添加10颗子弹

xsd = Soldier('许三多')#实例化一个许三多的士兵对象

xsd.gun = ak47#把枪交到许三多手中

xsd.fire()#开火

 继承

  目标:

    单继承

    多继承

    继承:

      继承实现代码的重用,相同的代码不需要重复的编写

class Anamal:
def eat(self):
print('吃')
def drink(self):
print('喝')
def run(self):
print('跑')
def sleep(self):
print('睡')
class Dog(Anamal):
def bark(self):
print('汪汪叫') class XiaoTianQuan(Dog):

def fly(self):

print('我会飞啦!!!!')

dog = XiaoTianQuan()

dog.eat()

dog.run()

dog.sleep()

dog.drink()

dog.bark()

dog.fly()

  方法的重写

#重写哮天犬叫唤的方法
class Anamal(object):
def eat(self):
print('吃')
def drink(self):
print('喝')
def run(self):
print('跑')
def sleep(self):
print('睡')
class Dog(Anamal):
def bark(self):
print('汪汪叫') class XiaoTianQuan(Dog):

def fly(self):

print('我会飞啦!!!!')
</span><span style="color: #ff0000;">def bark(self):
print('牛逼的叫.......'</span><span style="color: #000000;"><span style="color: #ff0000;">)</span>

dog = XiaoTianQuan()

dog.eat()

dog.run()

dog.sleep()

dog.drink()

dog.bark()

dog.fly()

  对父类的方法进行扩展

    1.在子类中重写父类的方法

    2.在需要的位置使用super().父类方法来调用父类方法的执行

    3.代码其他的位置针对子类的需求,编写子类特有的代码实现

  关于super

    在python中super是一个特殊的类

    super()就是使用super类创建出来的对象

    最常使用的场景就是在重写父类方法时,调用在父类中封装的方法实现

#用super继承父类的方法并扩展新内容
class Anamal(object):
def eat(self):
print('吃')
def drink(self):
print('喝')
def run(self):
print('跑')
def sleep(self):
print('睡')
class Dog(Anamal):
def bark(self):
print('汪汪叫') class XiaoTianQuan(Dog):

def fly(self):

print('我会飞啦!!!!')
</span><span style="color: #ff0000;">def bark(self):
print('牛逼的叫.......')
super().bark()
print('%*#*@^$*(@'</span><span style="color: #000000;"><span style="color: #ff0000;">)

dog = XiaoTianQuan()
dog.eat()
dog.run()
dog.sleep()
dog.drink()
dog.bark()
dog.fly()

  初始化__init__继承

class Person():
def __init__(self, name):
self.name = name class KOBE(Person):

def init(self, age):

super(KOBE, self).init('科比')

self.age = age

kobe = KOBE(18)

print(kobe.name)

print(kobe.age)

 多态

  面向对象的三大特性:

  1.封装根据职责将属性和方法封装到一个抽象的类中

    • 定义类的准则

  2.继承实现代码的重用,相同的代码不需要重复的编写

    • 设计类的技巧
    • 子类针对自己特有的需求,编写特定的代码

  3.多态不同的子类对象调用相同的父类方法,产生不同的执行结果

    1.多态可以增加代码的灵活度

    2.以继承和重写父类方法为前提

    3.是调用方法的技巧,不会影响到类的内部设计

#多态的特性:让不同的子类对象调用相同的代码产生不同的结果
class Dog(object):
def __init__(self, name):
self.name = name
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> game(self):
</span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">'</span><span style="color: #800000;">%s 开开心心去玩耍.....</span><span style="color: #800000;">'</span> %<span style="color: #000000;"> self.name)

class XiaoTianQuan(Dog):

def game(self):

print('%s 开开心心去玩耍.....' % self.name)

class Person(object):

def init(self, name):

self.name = name

</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> game_with_dog(self, dog):
</span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">'</span><span style="color: #800000;">%s 和 %s 正在开开心心的玩耍......</span><span style="color: #800000;">'</span> %<span style="color: #000000;"> (self.name, dog.name))
dog.game()

#创建人对象

xiaoming = Person('小明')

#创建狗对象

dog = Dog('旺财')

#让小明跟狗玩耍

xiaoming.game_with_dog(dog)

异常处理

什么是异常?

异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。

一般情况下,在Python无法正常处理程序时就会发生一个异常。

异常是Python对象,表示一个错误。

当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。

异常处理:

捕捉异常可以使用try/except语句。

try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。

如果你不想在异常发生时结束你的程序,只需在try里捕获它。

语法:

以下为简单的try....except...else的语法:

try:
正常的操作
......................
except:
发生异常,执行这块代码
......................
else:
如果没有异常执行这块代码

例子:

try:
fh = open("testfile", "w")
fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
print("Error: 没有找到文件或读取文件失败")
else:
print("内容写入文件成功")
fh.close()

try-finally 语句:

try:
<语句>
finally:
<语句> #退出try时总会执行
raise
try:
fh = open("testfile", "w")
fh.write("这是一个测试文件,用于测试异常!!")
finally:
print("Error: 没有找到文件或读取文件失败")

用户自定义异常:

通过创建一个新的异常类,程序可以命名它们自己的异常。异常应该是典型的继承自Exception类,通过直接或间接的方式。

以下为与RuntimeError相关的实例,实例中创建了一个类,基类为RuntimeError,用于在异常触发时输出更多的信息。

在try语句块中,用户自定义的异常后执行except块语句,变量 e 是用于创建Networkerror类的实例。

class MyError(Exception):
def __init__(self,age):
self.age=age
# def __str__(self):
# return self.age def ag():

age=int(input('输入年龄:'))

if age<=0 or age>100:

raise MyError('年龄只能在0到100岁之间')

try:

ag()

except MyError as e:

print(e)

自定义异常

转载自:疯子7314
https://www.cnblogs.com/fengzi7314/

python第九章:面向对象--小白博客的更多相关文章

  1. python之yagmail模块--小白博客

    yagmail 实现发邮件 yagmail 可以简单的来实现自动发邮件功能. 安装 pip install yagmail 简单例子 import yagmail #链接邮箱服务器 yag = yag ...

  2. Python爬虫简单实现CSDN博客文章标题列表

    Python爬虫简单实现CSDN博客文章标题列表 操作步骤: 分析接口,怎么获取数据? 模拟接口,尝试提取数据 封装接口函数,实现函数调用. 1.分析接口 打开Chrome浏览器,开启开发者工具(F1 ...

  3. 这几天有django和python做了一个多用户博客系统(可选择模板)

    这几天有django和python做了一个多用户博客系统(可选择模板) 没完成,先分享下 断断续续2周时间吧,用django做了一个多用户博客系统,现在还没有做完,做分享下,以后等完善了再慢慢说 做的 ...

  4. python环境变量配置 - CSDN博客

    一.下载: 1.官网下载python3.0系列(https://www.python.org/) 2.下载后图标为: 二.安装: Window下: 1.安装路径: 默认安装路径:C:\python35 ...

  5. python网络爬虫 新浪博客篇

    上次写了一个爬世纪佳缘的爬虫之后,今天再接再厉又写了一个新浪博客的爬虫.写完之后,我想了一会儿,要不要在博客园里面写个帖子记录一下,因为我觉得这份代码的含金量确实太低,有点炒冷饭的嫌疑,就是把上次的代 ...

  6. 用Python和Django实现多用户博客系统(二)——UUBlog

    这次又更新了一大部分功能,这次以app的形式来开发. 增加博客分类功能:博客关注.推荐功能(ajax实现) 增加二级频道功能 更多功能看截图及源码,现在还不完善,大家先将就着看.如果大家有哪些功能觉的 ...

  7. 在 Windows Azure 网站上使用 Django、Python 和 MySQL:创建博客应用程序

    编辑人员注释:本文章由 Windows Azure 网站团队的项目经理 Sunitha Muthukrishna 撰写. 根据您编写的应用程序,Windows Azure 网站上的基本Python 堆 ...

  8. Python开发【项目】:博客后台

    概述 通过自己写的博客后台代码.思路,来与武sir的代码进行一个差异化的比较,记录之间的差距,改善以后写代码的思路 博客后台这个项目,对之前Django学习的各个知识点都有涉及到,非常重要 用户登录验 ...

  9. python关于Django搭建简单博客项目(详解一)

    上一篇我们说了如何搭建简易博客网站,下面我们来进行详细解答.本文没有特定顺序,请结合上一篇和源代码参照学习. 相关源代码和解析请参看:https://github.com/Cheng0829/mysi ...

随机推荐

  1. 大前端的自动化工厂(1)——Yeoman

    一.Yeoman是什么 Yeoman是现代化前端项目的脚手架工具,用于生成包含指定框架结构的工程化目录结构.它是整个前端自动化工厂的第一站. 从个人使用者的角度来看,Yeoman的地位有些鸡肋,因为流 ...

  2. 第27章 联合网关 - Identity Server 4 中文文档(v1.0.0)

    通用架构是所谓的联合网关.在此方法中,IdentityServer充当一个或多个外部身份提供商的网关. 该架构具有以下优点: 您的应用程序只需要了解一个令牌服务(网关),并且屏蔽了有关连接到外部提供程 ...

  3. vb.net MakeWParam

    Private Function MakeWParam(loWord As Integer, hiWord As Integer) As Integer ) End Function

  4. Java开发笔记(六十六)映射:HashMap和TreeMap

    前面介绍了两种集合的用法,它们的共性为每个元素都是唯一的,区别在于一个无序一个有序.虽说往集合里面保存数据还算容易,但要从集合中取出数据就没那么方便了,因为集合居然不提供get方法,没有get方法怎么 ...

  5. SpringBoot项目部署到服务器上,tomcat不启动该项目

    今天lz把项目重新传到服务器上后,重启tomcat遇到个问题,就是这个tomcat怎么都不启动这个项目,别的项目都没事,一番查找后发现问题所在. 我们先建个SpringBoot工程,重现一下问题: 写 ...

  6. SpringBoot究竟是如何跑起来的?

    摘要: 神奇的SpringBoot. 原文:SpringBoot 究竟是如何跑起来的? 作者:老钱 Fundebug经授权转载,版权归原作者所有. 不得不说 SpringBoot 太复杂了,我本来只想 ...

  7. 【阿里云】在 Windows Server 2016 下使用 FileZilla Server 安装搭建 FTP 服务

     Windows Server 2016 下使用 FileZilla Server 安装搭建 FTP 服务 一.安装 Filezilla Server 下载最新版本的 Filezilla Server ...

  8. TextView图文混排

    大家都知道,textView有一个setCompoundDrawables的方法来设置上下左右位置的图标,当然,也可以在xml布局文件中设置,然而问题来了,假如我们把图标放在左边,当我们让TextVi ...

  9. pwn with glibc heap(堆利用手册)

    前言 ​ 对一些有趣的堆相关的漏洞的利用做一个记录,如有差错,请见谅. ​ 文中未做说明 均是指 glibc 2.23 ​ 相关引用已在文中进行了标注,如有遗漏,请提醒. 简单源码分析 ​ 本节只是简 ...

  10. 使用 Dashboard - 每天5分钟玩转 Docker 容器技术(174)

    上一节我们完成了 Kubernetes Dashboard 的安装,本节就来实践一下. Dashboard 界面结构 Dashboard 的界面很简洁,分为三个大的区域. 顶部操作区在这里用户可以搜索 ...