python基础——面向对象的程序设计
python基础——面向对象的程序设计
1 什么是面向对象的程序设计
面向过程的程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西。
优点是:极大的降低了程序的复杂度
缺点是:一套流水线或者流程就是用来解决一个问题,生产汽水的流水线无法生产汽车,即便是能,也得是大改,改一个组件,牵一发而动全身。
应用场景:一旦完成基本很少改变的场景,著名的例子有Linux内核,git,以及Apache HTTP Server等
面向对象的程序设计的核心是对象。对象(object)基本上可以看做数据(特性)以及由一系列可以存取、操作这些数据的方法所组成的集合。
优点是:解决了程序的扩展性。对某一个对象单独修改,会立刻反应到整体体系中,如对游戏中一个人物参数的特征和技能修改都很容易。
缺点是:可控性差,无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程和结果,面向对象的程序一旦开始就由对象之间的交互解决问题,即使是上帝也无法预测最终结果。
应用场景:需求经常变化的软件,一般需求的变化都集中在用户层,互联网应用,企业内部软件,游戏等都是面向对象的程序设计大显身手的好地方。
面向对象的程序设计并不是全部。对于一个软件质量来说,面向对象的程序设计知识用来解决扩展性。
2 类和对象
对象(object)基本上可以看做数据(特性)以及由一系列可以存取、操作这些数据的方法所组成的集合。
类,可以看成种类,类型,从一组对象中提取到的相似部分。所有的对象都属于一个类,称为类的实例。
之前学习的数据类型就是类
- print(int)
- print(Garen)
输出结果:
- <class 'int'>
- <class '__main__.Garen'>
3 类
3.1 初始类
1 声明类 (和声明函数很相似)
- 类的定义格式
- class 类名:
- '类的文档字符串'
- 类体
2 创建一个类:
- class Data:
- pass
*Python编程中习惯类名使用单数单词并且首字母大写
类是数据与函数的结合,二者称为类的属性
- class Garen: #定义英雄盖伦的类,不同的玩家可以用它实例出自己英雄;
- camp='Demacia' #所有玩家的英雄(盖伦)的阵营都是Demacia;
- def attack(self,enemy): #普通攻击技能,enemy是敌人;
- enemy.life_value-=self.aggressivity #根据自己的攻击力,攻击敌人就减掉敌人的生命值。
3.2 类的作用1:属性引用
属性引用(类名.属性)
(1)引用类的数据属性(类名.变量名)
- print(Garen.camp) # 引用类的数据属性,该属性与所有对象/实例共享
输出结果为:
- Demacia
(2)引用类的函数属性(类名.函数名)
- print(Garen.attack) #引用类的函数属性,该属性也共享
输出结果为:
- <function Garen.attack at 0x00000059CE8FAF28>
(3)类的属性操作
- Garen.name='Garen1' #增加属性
- print(Garen.name) #查询属性
输出结果为:
- Garen1
- del Garen.name #删除属性
- print(Garen.name)
输出结果为:
- AttributeError: type object 'Garen' has no attribute 'name' #报错
- Garen.camp="aaaa" #修改属性
- print(Garen.camp)
输出结果为:
- aaaa
3.3 类的作用2:实例化
(1)__init__实例化
类名加括号就是实例化,会自动触发__init__函数的运行,可以用他来为每个实例定制自己的特性
- class Garen:
- camp='Demacia'
- def __init__(self,nickname,aggressivity=58,life_value=455):
- self.nickname=nickname #为自己的盖伦起个别名;
- self.aggressivity=aggressivity #英雄都有自己的攻击力;
- self.life_value=life_value #英雄都有自己的生命值;
- def attack(self,enemy):
- print("attack %s" % enemy)
实例化:类名+括号
- g1=Garen('草丛伦')
#就是在执行Garen.__int__(g1,’草丛伦’),然后执行__init__内的代码g1.nickname=’草丛伦’等
(2)self作用
self的作用是在实例化时自动将对象/实例本身传给__init__的第一个参数,self可以是任意名字,但是self是大家公认的。
这种自动传递的机制还体现在g1.attack的调用上,后续会介绍
一:我们定义的类的属性到底存到哪里了?有两种方式查看
dir(类名):查出的是一个名字列表
类名.__dict__:查出的是一个字典,key为属性名,value为属性值
二:特殊的类属性
类名.__name__# 类的名字(字符串)
类名.__doc__# 类的文档字符串
类名.__base__# 类的第一个父类(在讲继承时会讲)
类名.__bases__# 类所有父类构成的元组(在讲继承时会讲)
类名.__dict__# 类的字典属性
类名.__module__# 类定义所在的模块
类名.__class__# 实例对应的类(仅新式类中)
4 对象(实例)
对象是关于类而实际存在的一个例子,即实例
#类实例化得到g1这个实例
- class Garen:
- camp='Demacia'
- def __init__(self,nickname,aggressivity=58,life_value=455):
- self.nickname=nickname #为自己的盖伦起个别名;
- self.aggressivity=aggressivity #英雄都有自己的攻击力;
- self.life_value=life_value #英雄都有自己的生命值;
- def attack(self,enemy):
- print("attack %s" % enemy)
- g1=Garen('草丛伦')
4.1 对象的属性引用和绑定方法
(1)对象(实例)只有一种作用:属性引用
格式: 实例名.类的变量名
实例名.绑定方法
实例名.实例自己的变量名
- print(g1.nickname)
- print(g1.aggressivity)
- print(g1.life_value)
输出结果为:
- 草丛伦
- 58
- 455
(2)对象的属性操作
查看属性信息
- print(g1.nickname)
输出结果:
- 草丛伦
修改属性信息
- g1.nickname="伦哥"
- print(g1.nickname)
输出结果为:
- 伦哥
添加属性
- g1.sex="female"
- print(g1.sex)
输出结果为:
- Female
删除属性:
- del g1.sex
- print(g1.sex)
输出结果为:
- AttributeError: 'Garen' object has no attribute 'sex' #报错
(3)查看实例属性
同样是dir和内置__dict__两种方式
特殊实例属性
__class__
__dict__
(4)对象(实例)的绑定方法
对象本身只有数据属性,但是python的class机制会将类的函数绑定到对象上,称为对象的方法,或者叫绑定方法。
- print(g1.attack) #对象的绑定方法
- print(Garen.attack) #对象的绑定方法attack本质就是调用类的函数attack的功能,二者是一种绑定关系
输出结果为:
- <bound method Garen.attack of <__main__.Garen object at 0x00000017370815F8>>
- <function Garen.attack at 0x0000001737085048>
对象的绑定方法的特别之处在于:obj.func()会把obj传给func的第一个参数
4.2 对象的交互
仿照Garen类创建一个Riven类:
实例Riven类
交互:瑞雯攻击草丛伦
- class Riven:
- camp='Noxus'
- def __init__(self,nickname,aggressivity=54,life_value=414):
- self.nickname=nickname #为自己的瑞雯起个别名;
- self.aggressivity=aggressivity #英雄都有自己的攻击力;
- self.life_value=life_value #英雄都有自己的生命值;
- def attack(self,enemy):
- print("attack %s" % enemy)
- enemy.life_value -= self.aggressivity
- g1=Garen('草丛伦')
- r1=Riven('瑞雯')
- print(g1.life_value)
- r1.attack(g1)
- print(g1.life_value)
输出结果为:
- 455
- 瑞雯 attack 草丛伦
- 401
python基础——面向对象的程序设计的更多相关文章
- python基础----面向对象的程序设计(五个阶段、对小白的忠告、关于OOP常用术语)、类、对象
一.面向对象的软件开发有如下几个阶段 1.面向对象分析(object oriented analysis ,O ...
- python基础——面向对象编程
python基础——面向对象编程 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...
- python基础--面向对象基础(类与对象、对象之间的交互和组合、面向对象的命名空间、面向对象的三大特性等)
python基础--面向对象 (1)面向过程VS面向对象 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. ...
- python基础——面向对象进阶下
python基础--面向对象进阶下 1 __setitem__,__getitem,__delitem__ 把对象操作属性模拟成字典的格式 想对比__getattr__(), __setattr__( ...
- python基础——面向对象进阶
python基础--面向对象进阶 1.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 ...
- Python 基础 面向对象之二 三大特性
Python 基础 面向对象之二 三大特性 上一篇主要介绍了Python中,面向对象的类和对象的定义及实例的简单应用,本篇继续接着上篇来谈,在这一篇中我们重点要谈及的内容有:Python 类的成员.成 ...
- Python自动化 【第七篇】:Python基础-面向对象高级语法、异常处理、Scoket开发基础
本节内容: 1. 面向对象高级语法部分 1.1 静态方法.类方法.属性方法 1.2 类的特殊方法 1.3 反射 2. 异常处理 3. Socket开发基础 1. ...
- Python进阶---面向对象的程序设计思想
Python的面向对象 一.面向过程与面向对象的对比 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优 ...
- python学习------面向对象的程序设计
一 面向对象的程序设计的由来 1940年以前:面向机器 最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的指令和数 据.简单来说,就是直接编写 和 的序列来代表程序语言 ...
随机推荐
- java 连接 elasticsearch 报错java.lang.NoClassDefFoundError: org/apache/http/auth/Credentials 解决
您的问题是您在应用程序类路径中缺少必需的JAR(这导致ClassNotFound异常).如果您下载了包含IP Camera驱动程序(webcam-capture-driver-ipcam-0.3.10 ...
- vue组件利用formdata图片预览以及上传《转载》
转载修改 在项目中直接新建一个单文件页,复制一下代码即可 upload组件: <template> <div class="vue-uploader" ...
- js中, 用变量或对象作为if或其他条件的表达式
源: 因为js是弱语言, 就体现在js的变量是弱类型的, 在js中所有变量类型声明都用var, 而在其他强类型语言中,如java/c,必须有强制类型转换和类型检查才能编译通过等, 但是: 弱语言也有优 ...
- Java线程中断机制-如何中断线程
介绍: 对于线程一共分为五个状态:新建状态,就绪状态,阻塞状态,运行状态,死亡状态,有时候把阻塞状态又分为同步阻塞和等待阻塞. 有时想让主线程启动的一个子线程结束运行,我们就需要让这个子线程中断,不再 ...
- Java String常用方法
字符串查找 两种查找字符串的方法,indexOf(String s)和lastIndexOf(String s). String str = "tyson-json"; int i ...
- thinkphp5多图上传 js部分
在项目中常会用到多图上上传,那就需要多图上传后需要预览,并且能删掉传错(不想传)的图,然而 测试了半天 并不知道jq怎么写,parent()parents()用了半天无果,罢了,还是用原生js来写.这 ...
- django初探-创建简单的博客系统
django第一步 1. django安装 pip install django print(django.get_version()) 查看django版本 2. 创建项目 打开cmd,进入指定目录 ...
- 动态规划(Dynamic programming) 走楼梯
来自:算法爱好者 有一座高度是10级台阶的楼梯,从下往上走,每跨一步只能向上1级或者2级台阶,要求用程序来求出一共有多少种走法? f(10) = f(9) + f(8) f(9) = f(8) + f ...
- springboot elasticsearch 集成注意事项
文章来源: http://www.cnblogs.com/guozp/p/8686904.html 一 elasticsearch基础 这里假设各位已经简单了解过elasticsearch,并不对es ...
- Beta第六天
听说