Python3.5面向对象编程图文与实例详解


Posted in Python onApril 24, 2019

本文实例讲述了Python3.5面向对象编程。分享给大家供大家参考,具体如下:

1、面向过程与面向对象的比较

(1)面向过程编程(procedural programming)

面向过程编程又被称为:top-down languages,程序从上到下 一步步执行,从头到尾的解决问题。

基本设计思路为:程序一开始是解决一个大问题,然后把大问题分解成多个小问题或子过程,这些小问题执行的时候再继续分解,

直到小问题足够简单到可以在一个小范围内解决。

缺点:若程序要进行修改,则修改的部分依赖的各个部分也要修改,这样会发生一连串的影响,随着程序越来越大,编程方式的维护难度也会越来越高。

所以,如果写一下简单的脚本,去做一些一次性的任务,用面向过程的方式是极好的,如果要处理的任务是复杂的,且需要不断迭代和维护的,还是用面向对象是最方便的。

(2)面向对象编程(oop)

面向对象编程是利用“类”和“对象”来创建各种模型来实现对真实世界的描述。

优点:可以使程序的维护和扩展变得简单,并且可以大大提高程序的开发效率;另外,基于对象的程序编程,可以让别人更加理解你的代码逻辑,是团队开发变得更加从容。

核心的特征:世界万物皆对象,世界万物皆可分类。

a、类(class)

类:是对一类拥有相同属性的对象的抽象、蓝图、原型。在类中定义了这些对象都具备的属性、共同的方法。

b、对象(object)

对象:类实例化后的实例,一个类必须经过实例化方能在程序中调用。

一个类可以实例化多个对象,每个对象可以有不同的属性。人类是指使用的人,每个人是指具体的对象。

c、封装(encapsulation)

在类中对数据的赋值、内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面包含着类的数据和方法。

d、继承(Inheritance)

一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承。

e、多态(Polymorphism)

多态:是面向对象的重要特性,简单点说:“一个接口,多种实现”,指一个基类中派生出了不同的子类,

且每个子类在继承了同样的方法名的同时又对父类的方法做了不同的实现,这就是同一种事物表现出的多种形态。

编程其实就是一个将具体世界进行抽象化的过程,多态就是抽象化的一种体现。

把一系列具体事物的共同点抽象出来, 再通过这个抽象的事物, 与不同的具体事物进行对话。

多态允许将子类的对象当作父类的对象使用,某父类型的引用指向其子类型的对象,调用的方法是该子类型的方法。

这里引用和调用方法的代码编译前就已经决定了,而引用所指向的对象可以在运行期间动态绑定。

2、面向对象编程

(1)无论什么形式的编程,都要明确一下原则:写重复的代码是非常不好的地级行为;之前写的代码需要不断的更新。

所以,开发的程序要遵循易读、易改的原则,即:可读性好、易扩展。

(2)示例代码:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:ZhengzhengLiu

#面向对象--CS游戏模拟

class Role(object):
  def __init__(self,name,role,weapon,life_value=100,money=15000):
    self.name = name
    self.role = role
    self.weapon = weapon
    self.life_value = life_value
    self.money = money

  def shot(self):
    print("shotting...")

  def got_shot(self):
    print("ah...%s got shot..." %self.name)

  def buy_gun(self,gun_name):
    print("%s just bought %s" %(self.name,gun_name))

r1 = Role("Jack","police","AK-47")  #实例化(初始化一个类,创建了一个对象)
r1.buy_gun("B51")

r2 = Role("Amy","terrorist","B22") 
r2.got_shot()

运行结果:

Jack just bought B51
ah...Amy got shot...

注:

a、类的基本定义

Python3.5面向对象编程图文与实例详解

第一句:定义一个类,class是定义类的语法,Role是类名,(object)是新式类的写法,必须这样写;

第二句:__init__()叫做初始化方法,也叫构造方法(虽然它是函数的形式,但在类中就不叫函数了,叫做方法),在类被调用时这个方法会自动执行,进行一些初始化动作,

所以__init__(self,name,role,weapon,life_value=100,money=15000)就是要在创建一个角色时给它设置这些属性。

b、实例化:把一个类变成一个具体的对象的过程叫实例化。

Python3.5面向对象编程图文与实例详解

在这里,实例化生成一个角色,会自动把参数传给类Role下面的__init__(...)方法。

初始化一个角色,就需要调用这个类一次;上面的创建角色时,并没有给__init__(...)传值,是因为类在调用它自己的__init__(...)是自己帮你给self参数赋值了。

Python3.5面向对象编程图文与实例详解

执行r1 = Role('liu','police','AK47')时,python的解释器其实干了两件事:
1、  在内存中开辟一块空间指向r1这个变量名。
2、  调用Role这个类并执行其中的__init__(…)方法,相当于Role.__init__(r1,'Jack','police','AK47'),这么做是为什么呢? 

是为了把'Jack','police','AK47'这3个值跟刚开辟的r1关联起来,因为关联起来后,你就可以直接r1.name, r1.weapon 这样来调用。

所以,为实现这种关联,在调用__init__方法时,就必须把r1这个变量也传进去,否则__init__不知道要把那3个参数跟谁关联。

所以这个__init__(…)方法里的,self.name = name , self.role = role 等等的意思就是要把这几个值 存到r1的内存空间里。

Python3.5面向对象编程图文与实例详解

结:self就是示例本身,实例化时Python会自动把这个示例本身通过self参数传递进去。

Python3.5面向对象编程图文与实例详解

r1.buy_gun("B51")===》Python会自动转换成:Role.buy_gun(r1,"B51”)

依然没给self传值 ,但Python还是会自动的帮你把r1 赋值给self这个参数, 为什么呢? 因为,你在buy_gun(..)方法中可能要访问r1的一些其它属性, 

比如这里就访问 了r1的名字,怎么访问呢?你得告诉这个方法,于是就把r1传给了这个self参数,然后在buy_gun里调用 self.name 就相当于调用r1.name ,

如果还想知道r1的生命值 有多少,直接写成self.life_value就可以了。

总结:

a、上面的这个r1 = Role('Alex','police','AK47')动作,叫做类的“实例化”, 就是把一个虚拟的抽象的类,通过这个动作,变成了一个具体的对象了, 这个对象就叫做实例。
b、刚才定义的这个类体现了面向对象的第一个基本特性,封装,其实就是使用构造方法将内容封装到某个具体对象中,然后通过对象直接或者self间接获取被封装的内容。

3、实例变量与类变量

Python3.5面向对象编程图文与实例详解

(1)类变量:存在类的内存中,没有实例化即可使用;实例化后,通过实例也可调用类变量。作用:共用的属性,节省开销。

(2)实例变量:描述某个具体对象一些特定的属性,只能在实例本身中使用。

(3)区别:若一个类中,既有类变量name,又有实例变量name,则先找实例变量,实例变量没有的情况下,再找类变量。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:ZhengzhengLiu

#面向对象--CS游戏模拟

class Role(object):
  n = 123   #类变量
  def __init__(self,name,role,weapon,life_value=100,money=15000):
    #构造函数
    #作用:在实例化时做一些类的初始化工作
    self.name = name    #实例变量(静态属性),作用域就是实例本身
    self.role = role
    self.weapon = weapon
    self.life_value = life_value
    self.money = money

  def shot(self):   #类的方法(功能)--动态属性
    print("shotting...")

  def got_shot(self):
    print("ah...%s got shot..." %self.name)

  def buy_gun(self,gun_name):
    print("%s just bought %s" %(self.name,gun_name))

#r1是类Role的一个实例化对象
# 实例化就是以类Role为模板,在内存开辟一块空间,存上数据,赋值成一个变量名
#实例化(初始化一个类,创建了一个对象)
r1 = Role("Jack","police","AK-47")  #此时self相当于r1,Role(r1,"Jack","police","AK-47")
r1.buy_gun("B51")    #r1也被称作Role的一个实例

r1.name = "liu"   #修改r1的实例变量
r1.n = "改变类变量"  #在r1中修改类变量n的值,相当于创建一个n,不会影响r2
r1.bullet_prove = True   #添加新的属性,只能在r1中使用
print(r1.n)

r2 = Role("Amy","terrorist","B22") #此时self相当于r2,Role(r2,"Amy","terrorist","B22")
r2.got_shot()
print(r2.n)

Role.n = "abc"   #通过类名修改类变量的值
print("r1:",r1.n)
print("r2:",r2.n)

运行结果:

liu just bought B51
改变类变量
ah...Amy got shot...
123
r1: 改变类变量
r2: abc

4、析构函数        def __del__(self):

作用:在实例销毁/释放时自动执行,通常用于做一些收尾工作,如:关闭一些数据库链接,关闭打开临时的文件。

析构函数的调用顺序与构造方法的调用顺序相反。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:ZhengzhengLiu

#面向对象--CS游戏模拟

class Role(object):
  n = 123   #类变量
  def __init__(self,name,role,weapon,life_value=100,money=15000):
    #构造函数
    #作用:在实例化时做一些类的初始化工作
    self.name = name    #实例变量(静态属性),作用域就是实例本身
    self.role = role
    self.weapon = weapon
    self.life_value = life_value
    self.money = money

  def __del__(self):   #析构函数
    print("%s game over..." %self.name)

  def shot(self):   #类的方法(功能)--动态属性
    print("shotting...")

  def got_shot(self):
    print("ah...%s got shot..." %self.name)

  def buy_gun(self,gun_name):
    print("%s just bought %s" %(self.name,gun_name))

r1 = Role("Jack","police","AK-47")
r1.buy_gun("AK47")
r1.got_shot()

r2 = Role("Amy","terrorist","B22")
r2.got_shot()

运行结果:

Jack just bought AK47
ah...Jack got shot...
ah...Amy got shot...
Amy game over...
Jack game over...

5、私有方法、私有属性(变量)    在变量或者方法前面添加两个下划线 "__",即可变成私有方法、私有属性

私有属性只能在类的内部,通过self使用,在类的外部无法直接访问和修改其内容。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:ZhengzhengLiu

#面向对象--CS游戏模拟

class Role(object):
  n = 123   #类变量
  def __init__(self,name,role,weapon,life_value=100,money=15000):
    #构造函数
    #作用:在实例化时做一些类的初始化工作
    self.name = name    #实例变量(静态属性),作用域就是实例本身
    self.role = role
    self.weapon = weapon
    self.__life_value = life_value   #私有属性/私有变量
    self.money = money

  def __del__(self):   #析构函数
    print("%s game over..." %self.name)

  def show_status(self):    #私有属性只能在类的内部使用
    print("name:%s weapon:%s life_val:%s" %(self.name,self.weapon,self.__life_value))

  def shot(self):   #类的方法(功能)--动态属性
    print("shotting...")

  def got_shot(self):
    self.__life_value -= 50
    print("ah...%s got shot..." %self.name)

  def buy_gun(self,gun_name):
    print("%s just bought %s" %(self.name,gun_name))

r1 = Role("Jack","police","AK-47")
r1.buy_gun("AK47")
r1.got_shot()
r1.show_status()

运行结果:

Jack just bought AK47
ah...Jack got shot...
name:Jack weapon:AK-47 life_val:50
Jack game over...

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python执行shell获取硬件参数写入mysql的方法
Dec 29 Python
Python使用matplotlib实现在坐标系中画一个矩形的方法
May 20 Python
Python实现将文本生成二维码的方法示例
Jul 18 Python
Python使用requests提交HTTP表单的方法
Dec 26 Python
Python实现的简单线性回归算法实例分析
Dec 26 Python
Python3之不使用第三方变量,实现交换两个变量的值
Jun 26 Python
微信小程序python用户认证的实现
Jul 29 Python
python实现把二维列表变为一维列表的方法分析
Oct 08 Python
python+Selenium自动化测试——输入,点击操作
Mar 06 Python
python实现遍历文件夹图片并重命名
Mar 23 Python
python/golang 删除链表中的元素
Sep 14 Python
Python 读写 Matlab Mat 格式数据的操作
May 19 Python
Python对ElasticSearch获取数据及操作
Apr 24 #Python
Python3.5面向对象与继承图文实例详解
Apr 24 #Python
Python3.5基础之NumPy模块的使用图文与实例详解
Apr 24 #Python
基于python的ini配置文件操作工具类
Apr 24 #Python
python实现简单日期工具类
Apr 24 #Python
NumPy 基本切片和索引的具体使用方法
Apr 24 #Python
Python使用dict.fromkeys()快速生成一个字典示例
Apr 24 #Python
You might like
电脑硬件及电脑配置知识大全
2020/03/17 数码科技
PHP通过反射动态加载第三方类和获得类源码的实例
2015/11/27 PHP
PHP+MySQL实现的简单投票系统实例
2016/02/24 PHP
php项目开发中用到的快速排序算法分析
2016/06/25 PHP
jquery 层次选择器siblings与nextAll的区别介绍
2013/08/02 Javascript
轻松创建nodejs服务器(10):处理POST请求
2014/12/18 NodeJs
JavaScript实现向右伸出的多级网页菜单效果
2015/08/25 Javascript
jquery移动端TAB触屏切换实现效果
2020/12/22 Javascript
javascript电商网站抢购倒计时效果实现
2015/11/19 Javascript
JSON+Jquery省市区三级联动
2016/01/13 Javascript
详解javascript实现瀑布流列式布局
2016/01/29 Javascript
jQuery代码实现对话框右上角菜单带关闭×
2016/05/03 Javascript
[js高手之路]从原型链开始图解继承到组合继承的产生详解
2017/08/28 Javascript
详解vue中this.$emit()的返回值是什么
2019/04/07 Javascript
python爬虫实现教程转换成 PDF 电子书
2017/02/19 Python
详解Python函数可变参数定义及其参数传递方式
2017/08/02 Python
Python实现改变与矩形橡胶的线条的颜色代码示例
2018/01/05 Python
使用CSS3的appearance属性改变任何元素的浏览器默认风格
2012/12/24 HTML / CSS
html5记忆翻牌游戏实现思路及代码
2013/07/25 HTML / CSS
魔声耳机官方网站:Monster是世界第一品牌的高性能耳机
2016/10/26 全球购物
英国知名奢侈品包包品牌:Milli Millu
2016/12/22 全球购物
Envie de Fraise意大利:法国网上推出的孕妇装品牌
2020/10/18 全球购物
后勤园长自我鉴定
2013/10/17 职场文书
大学生职业生涯规划书范文
2014/01/04 职场文书
单位消防安全制度
2014/01/12 职场文书
实习鉴定评语
2014/01/19 职场文书
毕业生求职信的经典写法
2014/01/31 职场文书
大学生创业项目方案
2014/03/08 职场文书
学雷锋活动总结报告
2014/06/26 职场文书
党支部半年考察意见
2015/06/01 职场文书
六一活动主持词
2015/06/30 职场文书
教师岗位说明书
2015/09/30 职场文书
创业计划书之奶茶店开店方案范本!
2019/08/06 职场文书
apache基于端口创建虚拟主机的示例
2021/04/24 Servers
浅谈PHP7中的一些小技巧
2021/05/29 PHP
MySQL窗口函数的具体使用
2021/11/17 MySQL