前言
其实,在写这一篇文章之前我是十分纠结的,我在想到底是用世界观来阐述面向对象思想还是站在程序功能的角度去阐述面向对象思想,最终我决定使用两方面的角度来阐述面向对象这个概念,请记住:编程思想只是一种思想,与任何语言都无关,不要觉得面向对象就一定比面向过程好,实际上恰恰相反。面向过程才是所有代码在内存中最终的状态。
面向过程编程思想
特性:模块化 流程化
优点:性能比面向对象高, 因为类调用时需要实例化,开销比较大,比较消耗资源;
单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
缺点:没有面向对象易维护、易复用、易扩展
面向过程的思想就在于将一个问题逐步解决,将大问题分解成各种小步骤一步一步去执行,一旦完成基本很少会有改变的场景,著名的例子有Linux内核
,git
等等。优点是代码可读性较高。并且他也是很多初学者最开始的一种思维方式,更多的是关心下一步操作该怎么做,以正在发生为目的。
name = "老王"# 第一步:买茶壶和茶叶print("老王在超市买了一个茶壶和一袋茶叶...")# 第二步:取水print("老王拿出了珍藏已久的农夫山泉...")# 第三步:生火print("老王掏出打火机,点燃了一堆木屑...")# 第四步:泡茶def teapot(water,tea): print("正在泡茶啊") print("咕噜噜。。茶叶泡好了") return "使用{0}泡好的{1}".format(water,tea)print("老王正在泡茶..")# 第五步:喝茶res = teapot("农夫山泉","铁观音")print("老王正在喝...",res)
函数式编程思想
特点:无变量,无for循环
优点:代码重复率低
缺点:程序易读性差
函数式编程是与数学函数高度结合的编程方式,纯粹的函数式编程语言没有变量只有常量,代码重复率较低,且功能一旦完善就不会出错,在函数中没有for
循环,所有的for
循环用递归实现,函数式编程的一个特点就是允许把函数本身作为参数传入另一个参数,还允许返回一个函数。此外,Python中的lambda
以及filter
,map
,reduce
等等都是从函数式编程中提取出来的一些优秀且符合Python核心思想的好案例。
# 自定义重现mapres = map(lambda x:x-1,[i for i in range(10)])print(list(res))def my_map(func,iterableser): res = [] count = 0 def process(func,iterableser,count): if len(iterableser): res.append(func(iterableser.pop(count))) process(func, iterableser, count) else: return process(func,iterableser,count) count+=1 return resres = my_map(lambda x:x-1,[i for i in range(10)])print(res)
面向对象编程思想
特性:抽象 封装 继承 多态
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护
缺点:性能比面向过程低
从世界观的角度阐述面向对象思想
对象:具体某一类的实际体
类:抽象的概念,实际上是不存在的
面向对象是一种思想,从世界观的角度可以认为:面向对象的基本哲学是认为世界是由各种各样具有自己的运动规律和内部状态的对象所组成的;不同对象之间的相互作用和通讯构成了完整的现实世界。因此,人们应当按照现实世界这个本来面貌来理解世界,直接通过对象及其相互关系来反映世界。这样建立起来的系统才能符合现实世界的本来面目。
而从方法学的角度可以认为:面向对象的方法是面向对象的世界观在开发方法中的直接运用。它强调系统的结构应该直接与现实世界的结构相对应,应该围绕现实世界中的对象来构造系统,而不是围绕功能来构造系统。
class
并不等于 面向对象 …. 而是属于Python里面向对象编程中的一种语法:
def dog(name,sex,colour): def init(name,sex,colour): dic1 = { "name":name, "sex":sex, "colour":colour, "bark":bark, "get_angry":get_angry, } return dic1 def bark(dic1): print("一只{0}颜色的{1}狗,它的名字是{2},它现在在朝你汪汪叫".format(dic1["colour"],dic1["sex"],dic1["name"])) def get_angry(dic1): print("{0}生气了,它朝你扑过来了!".format(dic1["name"])) return init(name,sex,colour)d1 = dog("大黄","公","黄")print(d1)d1["bark"](d1)d1["get_angry"](d1)
class Dog(object): def __init__(self,name,sex,colour): self.name = name self.sex = sex self.colour = colour def bark(self): print("一只{0}颜色的{1}狗,它的名字是{2},它现在在朝你汪汪叫".format(self.colour,self.sex,self.name)) def get_angry(self): print("{0}生气了,它朝你扑过来了!".format(self.name))d1 = Dog("大黄","公","黄")print(d1)d1.bark()d1.get_angry()
使用class
和上面def
定义的思想都是一样的,他们同属于面向对象程式设计,但是class
更为方便,还具备一些def
不具备的功能。
请记住,用面向对象语言写程序,和一个程序的设计是属于面向的对象设计是两种不同的概念,八杆子打不着。你可以用class
去利用面向过程的方式写代码,当然也可以用def
设计成面向对象的程序。
从程序功能角度来阐述面向对象思想
对象:存放数据与功能集合体的容器,也可称之为属性与方法。
类:类也是对象,存放具体实例对象公用的一些数据和功能。
面向对象的核心点在于对象二字,一切可以存放数据和功能的容器皆可称之为对象,面向对象实际上如果你真的已经接触过有一些时间了你会发现什么世界观的面向对象全是扯淡,我就觉得它的一个功能很强大!封装使用!用它来装东西使用非常方便!对,使用对象来装东西简直不要太好用。
其实从程序功能角度来分析面向对象没什么好说的,用多了之后就会知道。别跟我扯什么有用没用的,我就是这么用面向对象的。你可以说我low,但是我告诉你我根本做不到将现实世界的投影完全存放到程序中,对我来说这是扯淡。
有了面向对象我能做什么:
class Server(object): ip = "127.0.0.1" port = 8008 def __init__(self): self.__state = None def run(self): """启动服务""" print("本机IP:[{0}] 端口:[{1}] 服务启动成功".format(Server.ip, Server.port)) self.__state = 1 def stop(self): """停止服务""" self.__state = 0 print("正在停止服务") def get_status(self): if self.__state == 1: print("正在运行") else: print("没有运行") def send_client(self,clent_ip): print("本机IP [{0}] 正在向目标IP [{1}] 发送数据".format(Server.ip, clent_ip))server1 = Server()server1.run()server1.send_client("127.0.0.23")server1.stop()server1.get_status()# 我用面向对象就是这样,一些公共的数据我想要了我就从类里面去拿,没有了我就实例化自己造。# 我觉得它的使用很方便,让代码看起来很整洁,我就这样用,有问题吗?
评论前必须登录!
立即登录