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对字典进行排序实例
Sep 25 Python
Python中类型检查的详细介绍
Feb 13 Python
基于Python实现的ID3决策树功能示例
Jan 02 Python
python @property的用法及含义全面解析
Feb 01 Python
Python使用zip合并相邻列表项的方法示例
Mar 17 Python
Python 循环语句之 while,for语句详解
Apr 23 Python
Python模拟简单电梯调度算法示例
Aug 20 Python
浅析Python 读取图像文件的性能对比
Mar 07 Python
Django1.11自带分页器paginator的使用方法
Oct 31 Python
Python字节单位转换实例
Dec 05 Python
python中sort sorted reverse reversed函数的区别说明
May 11 Python
Pandas实现一列数据分隔为两列
May 18 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
PHP 和 COM
2006/10/09 PHP
PHP 采集程序 常用函数
2008/12/18 PHP
php产生随机数的两种方法实例代码 输出随机IP
2011/04/08 PHP
简单的PHP多图上传小程序代码
2011/07/17 PHP
PHP简单获取多个checkbox值的方法
2016/06/13 PHP
Thinkphp 中 distinct 的用法解析
2016/12/14 PHP
jquery监控数据是否变化(修正版)
2011/04/12 Javascript
javascript闭包传参和事件的循环绑定示例探讨
2014/04/17 Javascript
使用 TypeScript 重新编写的 JavaScript 坦克大战游戏代码
2015/04/07 Javascript
详解JavaScript正则表达式中的global属性的使用
2015/06/16 Javascript
jQuery+canvas实现的球体平抛及颜色动态变换效果
2016/01/28 Javascript
domReady的实现案例
2016/11/23 Javascript
Angular在一个页面中使用两个ng-app的方法(二)
2017/02/20 Javascript
详解ES6通过WeakMap解决内存泄漏问题
2018/03/09 Javascript
vue组件(全局,局部,动态加载组件)
2018/09/02 Javascript
jquery的$().each和$.each的区别
2019/01/18 jQuery
jquery登录的异步验证操作示例
2019/05/09 jQuery
解决layui checkbox 提交多个值的问题
2019/09/02 Javascript
JavaScript This指向问题详解
2019/11/25 Javascript
[02:36]DOTA2英雄基础教程 帕格纳
2014/01/20 DOTA
Django卸载之后重新安装的方法
2017/03/15 Python
numpy中loadtxt 的用法详解
2018/08/03 Python
Django中的静态文件管理过程解析
2019/08/01 Python
selenium中get_cookies()和add_cookie()的用法详解
2020/01/06 Python
在Python中用GDAL实现矢量对栅格的切割实例
2020/03/11 Python
linux系统都有哪些运行级别
2016/03/26 面试题
企业业务员岗位职责
2014/03/14 职场文书
团日活动总结书格式
2014/05/08 职场文书
大学生应聘求职信
2014/05/26 职场文书
元旦趣味活动方案
2014/08/22 职场文书
有子女的离婚协议书怎么写(范本)
2014/09/29 职场文书
2014年高二班主任工作总结
2014/12/16 职场文书
八达岭长城导游词
2015/01/30 职场文书
2015年汽车销售工作总结
2015/04/07 职场文书
Python中使用subprocess库创建附加进程
2021/05/11 Python
ssh服务器拒绝了密码 请再试一次已解决(亲测有效)
2022/08/14 Servers