面向对象编程思维导向图
面向:过程、函数、对象
面向过程:根据业务逻辑从上到下写垒代码!
面向过程的编程弊:每次调用的时候都的重写,代码特别长,代码重用性没有,每次增加新功能所有的代码都的修改!那有什么办法解决上面出现的弊端呢?函数就出现了。
面向函数:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可!
函数解释:
函数可以理解为一个一个的功能块,你把一个大的功能拆分成一块一块的,用某项功能的时候就去调用某个功能块即可!
函数可以理解为:乐高积木,给你一块一块的,你可以用这些积木块组成你想要的任何,功能!
函数可以调用函数!主函数的作用就是把函数进行串联、调用!函数本身是不能自己执行的如果你不调用就永不执行!
面向对象:更简单的重用代码!
什么是面向对象编程呢?就是所有的代码都是通过类和对象来实现的就是面向对象编程!
创建类和对象
面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)
Java和C#来说只支持面向对象编程,而python比较灵活即支持面向对象编程也支持函数式编程
所有语言的特性都是:封装、继承、多态(多态在python中体现的不是很好)
面向对象编程是一种编程方式:通过“类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用。
通过两个例子来看下:
例子一:
##方式一 #函数 def Bar(): print 'Bar' def Hello(name): print 'i am %s' %name Bar() Hello('tianshuai') #方式二 # 创建类 class Foo: def Bar(self): print 'Bar' def Hello(self, name): print 'i am %s' %name # 根据类Foo创建对象obj obj = Foo() obj.Bar() #执行Bar方法 obj.Hello('tianshuai') #执行Hello方法
那个简单?肯定是第一个简单为什么?不是说类的会更简单点吗?因为咱们类的东西还没有使用到!
def fetch(): def modify(): def remove(): def create() #我假设要添加一个值create函数里是不是的有: #连接数据库 hostname,prot,username,password,dbname #我是不是的保存这么多东西进行连接啊!连接之后是不是的打开数据库 #连接数据库 hostname,prot,username,password,dbname #打开 #操作 #关闭 那添加需吗?修改需要吗?查找需要吗?都需要那么看下实际的函数式编程的效果: def fetch(hostname,prot,username,password,dbname ,arg ): #连接数据库 hostname,prot,username,password,dbname #打开 #操作 #关闭 def modify(hostname,prot,username,password,dbname ,arg ): #连接数据库 hostname,prot,username,password,dbname #打开 #操作 #关闭 def remove(hostname,prot,username,password,dbname ,arg ): #连接数据库 hostname,prot,username,password,dbname #打开 #操作 #关闭 def create(hostname,prot,username,password,dbname ,arg) #连接数据库 hostname,prot,username,password,dbname #打开 #操作 #关闭 每一个函数里都包含了一些字段!你都给他参数化,这些是不是都的加到参数里边,你执行的时候都的给他传参数进去! fetch (hostname,prot,username,password,dbname ,[11,22,33,44]) modify (hostname,prot,username,password,dbname ,[11,22,33,44]) creremove ate(hostname,prot,username,password,dbname ,[11,22,33,44]) crcreate eate(hostname,prot,username,password,dbname ,[11,22,33,44]) 每次操作的时候是不是都的给他写一遍!
上面的方法是通过函数来实现的,那么看下,下面的例子通过面向对象来实现:
#!/usr/bin/env python #-*- coding:utf-8 -*- class Db_contrl(object): def __init__(self,hostname,port,username,password,dbname): #__init__ 构造方法,在实例化的时候执行 self.hostname = hostname self.port = port self.username = username self.password = password self.dbname = dbname def fetch(self): #连接数据库self.hostname,self.port,self.username,self.password,self.dbname #打开 #操作 #关闭 def modify(self): #连接数据库self.hostname,self.port,self.username,self.password,self.dbname #打开 #操作 #关闭 def create(self): #连接数据库self.hostname,self.port,self.username,self.password,self.dbname #打开 #操作 #关闭 def remove(self): #连接数据库self.hostname,self.port,self.username,self.password,self.dbname #打开 #操作 #关闭 obj1 = Db_contrl('1,1,1,1',80,'tianshuai','shuaige','testdb') obj1.fetch() obj1.modify() obj1.create() obj1.remove()
我现在在去调用的类里的方法的时候还需要去传参数吗?不需要了,python面向对象的最主要的就是封装!
那这些参数在那里呢?
obj1 = Db_contrl('1,1,1,1',80,'tianshuai','shuaige','testdb') 在实例化的时候我就把这些参数传给类了,他封装到了self中
如下图:
比如:boj1在调用一个create方法的时候,在obj1的这个对象里面不仅存储这个对象的参数,还有一个隐藏的参数叫做“类对象指针”,
他的作用就是告诉对象,去那里找方法!想想一下如果没有这个类对象指针,对象知道是那个模板创建的他吗?不知道的!
并且对象里是没有方法的方法是存储在类中的!如上图方法里每个都有:self 意思就是:obj1调用就是等于 def create(obj1) !!!
相比函数式编程,我是是不是每次调用的时候就没必要传一大堆参数了?
看完上面的例子就的想到:如果在一些方法里共同使用了一组变量,如果这时候使用函数式编程,每次调用方法的时候都的传这些参数!
这时候就要想到使用面向对象:把这些变量封装到对象中,每次调用的时候直接传这个对象即可!
例子三:
如果有有一个游戏,我要创建角色用函数怎么创建?是不是的写很多函数来实现很麻烦看下我的代码!
#!/usr/bin/env python #-*- coding:utf-8 -*- ''' 定义:游戏角色模板和基础功能 ''' import random class Game_pmodel(object): def __init__(self,name,profession,attack=0,blood=0,speed=0): #构造函数,名字和职业等信息 self.name = name #定义普通字段 self.profession = profession #定义普通字段 self.attack = attack self.blood = blood self.speed = speed def supershuai(self): self.blood = self.blood + 1000 self.attack = self.attack + 1000 self.speed = self.speed + 1000 print "