Python中使用class(),面向对象有什么优势
首先我是辣鸡,然后这个问题的确有点意思
首先,类是一个集合,包含了数据,操作描述的一个抽象集合
你可以首先只把类当做一个容器来使用
class Cycle: def __init__(self,r): self.pi=3.14 self.r=r a=Cycle(4) b=Cycle(7)
你看,我们定义了一个 Cycle 类,我们现在只是将它当做一个数据集合来用,我们利用其实例之间彼此数据隔离的特性来保证具体的实例数据彼此不污染。好了你现在想问,为什么我们要用数据集合来放数据
好了,我们来看看没有类之前我们会怎么样,假设我们现在要计算圆的面积
#Python学习交流QQ群:579817333 def square(r,pi): return pi * (r**2) PI=3.14 a_r=4 a_square=square(a_r,PI) b_r=7 b_square=square(b_r,PI)
看起来没有问题,好了,现在问题来了,假如,你现在要计算很多圆的面积,那么你是不是发现,不断的用变量命来隔离数据方式变得越来越脏了。而且你发现是不是有很多冗余的代码
好了我们这么改一改
class Cycle: def __init__(self,r): self.pi=3.14 self.r=r def square(value): if not isinstance(value,Cycle): raise ValueError("value muse be Cycle instace") value.square=value.pi * (value.r**2) #Python学习交流QQ群:579817333 a=Cycle(4) b=Cycle(7) square(a) square(b)
好了,你有没有觉得现在清晰了一点。
好了,现在我们现在还可以改一下
class Cycle: def __init__(self,r): self.pi=3.14 self.r=r def square(self,value): return self.pi * (self.r**2)
好了,现在你可能迷惑了,我们为啥要把 square 函数放在类中?
好了,我现在要计算长方形,原型,梯形各种各样二维几何图形的面积,这样该怎么写???
你想了想我们之前说的将类作为数据容器,你想了想写了如下的代码
class Rectangle: def __init__(self,length,height): self.length=length self.height=height class Cycle: def __init__(self,r): self.pi=3.14 self.r=r #Python学习交流QQ群:579817333 def rec_square(value): if not isinstance(value,Rectangle): raise ValueError("value muse be Rectangle instace") value.square=value.length * value.height def cycle_square(value): if not isinstance(value,Cycle): raise ValueError("value muse be Cycle instace") value.square=value.pi * (value.r**2)
你想一想,这样是不是感觉如果计算需求越来越多,代码是不是还是会越来越脏?
如果我们将函数放在类里,并且用继承的特性,我们可以写出这样的代码
class Geometry: def get_square(self): raise NotImplementedError class Rectangle(Geometry): def __init__(self,length,height): self.length=length self.height=height def get_square(self): return self.length*self.height #Python学习交流QQ群:579817333 class Cycle(Geometry): def __init__(self,r): self.pi=3.14 self.r=r def get_square(self): return self.pi * (self.r**2) def square(value): if not isinstance(value,Geometry): raise ValueError("value muse be Geometry instace") value.square=value.get_square()
你看,我们现在只需要给用户暴露一个统一的接口,用户(用户也以是我们自己)不需要关心怎么样选择正确的函数,他只需要调用统一的 square 函数,就可以获取到具体的面积,是不是轻松很多了??
所以,类,它是对数据,操作的一种封装,这个封装的意义在于我们可以去更好的优化代码结构。
好了再举一个例子,我们可以用类来控制访问权限
class People: def __init__(self,website): self.__favorite_website="1024.com" def bad_or_not(self): return self.__favorite_website=="1024.com"
你看,我们用 private 变量,来确保外部没法直接访问一些敏感数据(实际上 Python 里 private 并不严格,hook 一下还是可以访问的)
好,在举一个例子
class People: def __init__(self,website): self.__favorite_website="1024.com" def bad_or_not(self): return self.__favorite_website=="1024.com" @property #Python学习交流QQ群:579817333 def favorite_website(self): return self.__favorite_website @favorite_website.setter def favorite_website(self,value): if value=="1024.com": raise ValueError("你不能去草榴,兄弟,你营养不足") self.__favorite_website=value
你看,我们现在很方便的实现在设置数据值的时候,对其过滤。
撤了这么多,回到你的问题
首先A君说的没毛病,但我想知道仅仅使用函数锤子,螺丝刀来完成一个项目比使用Class工厂+函数锤子来完成一个项目的效率会更低么?
理由是什么?大神在什么时候会考虑使用Class来提高代码的“执行效率”和代码的“可读性”。回归实际情况,我很多时候都是调用同一个函数/方法去输出某个结果。
至今还想不出为什么调用Class会更方便?(PS:本人大菜鸟,写了上千行代码了,但仍然搞不懂什么情况下需要用到Class类。也曾尝试在自己的代码中强行加入Class输出结果
但感觉不灵活,而且要写的代码明显多了也不便于理解。求大神举例,碾压我的无知!)。C君说大型项目不使用Class调用对象会累死,到底这个“累死”体现在哪里?
首先一个问题,我整个答案里所写的这些代码,不用面向对象这一套能不能实现?
很明显,能。
但是实现的干净么?个人觉得不干净。
项目规格上去后,我们如果按照传统的方式进行开发,务必要多重检查,确保自己不会手抖调用了错误的东西。而 OOP 这一套思想,其实就是通过利用合适的代码结构和封装,某种程度上来讲是减少我们犯错的可能。
同时,现在开发基本都不是一个人的单打独斗,你写的代码可能会被其余人使用与维护。我们有个前提,要假设使用维护你代码的人都是傻逼。我们要适当的封装代码,优化结构,让使用者尽可能的少犯错、
所以最后,无论是各个语言的变量命名规则也好,还是 OOP 这一套范式也好。其本质是在自由度与可读性可维护性之间的一种相对较优的妥协,这种妥协根本的目的就在于通过规范化的操作与封装,减少团队开发维护的成本,优化开发体验。
另外,关于开发这一套还有个老生常谈的问题过度封装。我个人的观点是在你知道什么是 过度封装 之前,你没必要考虑这个问题,按照教科书和开源代码里的结构,去不断封装优化你的代码。
面向对象 更容易使用 ,缺点就是 换一个开发人,难维护,很难理解前面人的思维,出了错不好找位置
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
物联网为降低城市能源消耗铺平道路
图片来源:https://pixabay.com/images/id-1853323/ 编译:iotohme 如果不采取缓解措施,2050年,城市能源使用量将增加三倍以上。这将在我们的星球上留下巨大的生态足迹。 世界正变得越来越城市化 我们生活在一个日益城市化的世界里,一半以上的人口居住在城市里。在全球范围内,城市化正在快速推进:据估计,每周约有300万人迁入城市。按照这个速度,预计到2050年,世界城市人口的比例将达到66%。 城市生活通常与更高的教育水平、更好的医疗保健、更多的社会服务以及更多的文化和政治参与机会有关。与此同时,城市化对社会经济发展和环境保护提出了可持续的挑战。这与非洲和亚洲地区尤其相关,因为在这些地区,城市化速度最快。 城市发展导致高能耗 鉴于世界城市化趋势,城市需要为工业和商业活动、交通、建筑和基础设施、供水和食品生产提供持续的能源供应。研究人员发现,城市消耗了全球75%的能源,并排放了全球50%到60%的温室气体。其中电力和热能生产是最大的温室气体排放来源,其次是农业、工业、交通、建筑和其他部门。 如果不采取缓解措施,到2050年,城市能源使用量将增加三倍以上...
- 下一篇
Emulator 29.2.12 稳定版发布,启用 Google Maps UI
Android 模拟器 Emulator 29.2.12 稳定版发布了,它启用了一项新功能 Google Maps UI,这适用于开发与设备位置相关联的应用程序的开发人员。有了Google Maps UI,可以利用 Google Maps API 更轻松地指定位置,并从成对的位置构造路线。 Google Maps UI 扩展控件>位置现在包括一个集成的 Google Maps 视图,以及一个点选择器和路线生成器。可以保存各个点并将其作为虚拟位置重新发送到设备,而可以通过键入地址或单击两个点来生成路线。每条路线都可以重放;沿路线的位置会实时发送到访客操作系统。 其他改进: 改善了使用相机时的性能;摄像机帧现在与 vCPU 线程在单独的线程上传递。特别是在摄像机处于活动状态时,ADB 和其他服务(例如图形)不再成为阻碍。 (需要将来的系统镜像更新)通过主机一致性内存支持本身提高了虚拟相机框架的上载性能。 删除了未使用的指标报告。 从 AMD Hypervisor 后端删除了未使用的 API。 更新说明: https://androidstudio.googleblog.com/201...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8编译安装MySQL8.0.19
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS8安装Docker,最新的服务器搭配容器使用