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基础——面向对象的程序设计的更多相关文章

  1. python基础----面向对象的程序设计(五个阶段、对小白的忠告、关于OOP常用术语)、类、对象

    一.面向对象的软件开发有如下几个阶段                                              1.面向对象分析(object oriented analysis ,O ...

  2. python基础——面向对象编程

    python基础——面向对象编程 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...

  3. python基础--面向对象基础(类与对象、对象之间的交互和组合、面向对象的命名空间、面向对象的三大特性等)

    python基础--面向对象 (1)面向过程VS面向对象 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. ...

  4. python基础——面向对象进阶下

    python基础--面向对象进阶下 1 __setitem__,__getitem,__delitem__ 把对象操作属性模拟成字典的格式 想对比__getattr__(), __setattr__( ...

  5. python基础——面向对象进阶

    python基础--面向对象进阶 1.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 ...

  6. Python 基础 面向对象之二 三大特性

    Python 基础 面向对象之二 三大特性 上一篇主要介绍了Python中,面向对象的类和对象的定义及实例的简单应用,本篇继续接着上篇来谈,在这一篇中我们重点要谈及的内容有:Python 类的成员.成 ...

  7. Python自动化 【第七篇】:Python基础-面向对象高级语法、异常处理、Scoket开发基础

    本节内容: 1.     面向对象高级语法部分 1.1   静态方法.类方法.属性方法 1.2   类的特殊方法 1.3   反射 2.     异常处理 3.     Socket开发基础 1.   ...

  8. Python进阶---面向对象的程序设计思想

    Python的面向对象 一.面向过程与面向对象的对比 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优 ...

  9. python学习------面向对象的程序设计

    一 面向对象的程序设计的由来 1940年以前:面向机器 最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的指令和数 据.简单来说,就是直接编写 和 的序列来代表程序语言 ...

随机推荐

  1. 《深入理解计算机系统》第7章:重定位PC相对引用的理解

    在第七章<链接>中的静态链接有对符号进行重定位PC相对引用的处理,书上对应的还有公式,但不是很好理解.现做实验对公式进行理解(公式内容如有兴趣可以参考原文)

  2. C语言第六次作业--数据类型

    一.PTA实验作业 题目1,简单计算器: 1. 本题PTA提交列表 2. 设计思路 定义操作数num1,num2,结果result=0.运算符ch. 输入num1 while (ch=getchar( ...

  3. 页面内部DIV让点击外部DIV 事件不发生(阻止冒泡事件)

    如标题的情况,经常发生,尤其是在一些弹出框上面之类的. <script> function zuzhimaopao(){ e.stopPropagation(); } </scrip ...

  4. 如何进入MySQL

    C:\Users\电脑ID>D:D:\> cd D:\wamp\wamp64\bin\mysql\mysql5.7.19\binD:\wamp\wamp64\bin\mysql\mysql ...

  5. servlet的执行过程

    第一次访问servlet的过程: 服务器启动:在服务器启动的时候,加载项目,就扫描web.xml文件,获得应用有哪些servlet,url-pattern, 客户端通过URl访问服务器[向服务器发送一 ...

  6. Java8 中 ConcurrentHashMap工作原理的要点分析

    简介: 本文主要介绍Java8中的并发容器ConcurrentHashMap的工作原理,和其它文章不同的是,本文重点分析了不同线程的各类并发操作如get,put,remove之间是如何同步的,以及这些 ...

  7. window.print()打印页面指定内容(使用iframe保证原页面不失效)

    使用window.print()时会出现两个问题: (1)直接使用window.print() 打印的是整页内容-->无法实现打印指定区域 (2)打印时替换body中的内容,打印完成后再替换回来 ...

  8. 【Django】模型层说明

    [Django模型层] 之前大概介绍Django的文章居然写了两篇..这篇是重点关注了Django的模型层来进行学习. ■ 模型定义 众所周知,Django中的模型定义就是定义一个类,其基本结构是这样 ...

  9. 【Python】 用户图形界面GUI wxpython III 更多组件

    wxpython - 更多组件 我写到的这些组件可能一来不是很详细,二来不是最全的,想要更好地用这些组件,应该还是去看看教程和别的示例.比较简单的,推荐http://download.csdn.net ...

  10. java设计模式------工厂设计模式

    总结 以上就是工厂模式的基本实现和详细说明.包括了简单工厂模式.工厂方法模式.抽象工厂模式.我们可以基于需求来选择合适的工厂模式 基本概念:为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来 ...