首先,类是一个集合,包含了数据,操作描述的一个抽象集合

你可以首先只把类当做一个容器来使用

class Cycle:

def __init__(self,r):

self.pi=3.14

self.r=r

a=Cycle(4)

b=Cycle(7)

你看,我们定义了一个 Cycle 类,我们现在只是将它当做一个数据集合来用,我们利用其实例之间彼此数据隔离的特性来保证具体的实例数据彼此不污染。好了你现在想问,为什么我们要用数据集合来放数据

好了,我们来看看没有类之前我们会怎么样,假设我们现在要计算圆的面积

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)

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

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

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

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 这一套范式也好。其本质是在自由度与可读性可维护性之间的一种相对较优的妥协,这种妥协根本的目的就在于通过规范化的操作与封装,减少团队开发维护的成本,优化开发体验。

另外,关于开发这一套还有个老生常谈的问题过度封装。我个人的观点是在你知道什么是 过度封装 之前,你没必要考虑这个问题,按照教科书和开源代码里的结构,去不断封装优化你的代码。

面向对象 更容易使用 ,缺点就是 换一个开发人,难维护,很难理解前面人的思维,出了错不好找位置

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

本文标题: Python基于class()实现面向对象原理详解

本文地址: http://www.cppcns.com/jiaoben/python/304009.html

python是基于什么原理_Python基于class()实现面向对象原理详解相关推荐

  1. python中sort函数字符串_python中的sort方法使用详解

    < Python树莓派编程>--3.3 Python入门 本节书摘来自华章出版社<Python树莓派编程>一书中的第3章,第3.3节,作者:[美]沃尔弗拉姆·多纳特(Wolfr ...

  2. python中where的用法_Python中where()函数的用法详解

    本文主要和大家介绍了详解Python中where()函数的用法,小编觉得挺不错的,现在分享给大家,也给大家做个参,希望能帮助到大家. where()的用法 首先强调一下,where()函数对于不同的输 ...

  3. python语言程序的特点_Python语言概述及其运行机制详解

    即日起,我们将打开一个新的编程世界的大门--Python语言.Python是一种跨平台的计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新 ...

  4. python类初始化导入库_Python中optparser库用法实例详解

    本文研究的主要是Python中optparser库的相关内容,具体如下. 一直以来对optparser不是特别的理解,今天就狠下心,静下心研究了一下这个库.当然了,不敢说理解的很到位,但是足以应付正常 ...

  5. python编程字典100例_python中字典(Dictionary)用法实例详解

    本文实例讲述了python中字典(Dictionary)用法.分享给大家供大家参考.具体分析如下: 字典(Dictionary)是一种映射结构的数据类型,由无序的"键-值对"组成. ...

  6. python动态类型的坑_python进阶教程之动态类型详解

    动态类型(dynamic typing)是Python另一个重要的核心概念.我们之前说过,Python的变量(variable)不需要声明,而在赋值时,变量可以重新赋值为任意值.这些都与动态类型的概念 ...

  7. python对文件的处理_python文件处理fileinput使用方法详解

    这篇文章主要介绍了python文件处理fileinput使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.介绍 fileinput模块 ...

  8. python怎样快速下载库_Python如何急速下载第三方库详解

    前言 pip 是一个现代的,通用的 Python 包管理工具 ,是一个安装第三方 库必备的工具,提供了对Python 包的查找.下载.安装.卸载的功能.但是在国内使用有很多因素的限制,一个3.4M的库 ...

  9. python编程midi键盘按键_Python中捕获键盘的方式详解

    python中捕获键盘操作一共有两种方法 第一种方法: 使用pygame中event方法 使用方式如下:使用键盘右键为例 if event.type = pygame.KEYDOWN and even ...

  10. python画图软件是哪个_Python实现画图软件功能方法详解

    Python实现画图软件功能方法详解,按钮,事件,绑定,快捷键,直线 Python实现画图软件功能方法详解 易采站长站,站长之家为您整理了Python实现画图软件功能方法详解的相关内容. 概述 虽然P ...

最新文章

  1. April Fools Contest 2018
  2. C#获取枚举描述代码
  3. DotNetNuke: System.Security.Cryptography.CryptographicException: Bad Data
  4. FCM算法实现Python(简洁版)
  5. mysql分区有好处吗_mysql 分区有实用价值吗?
  6. vue项目通过directives指令实现vue实现盒子的移动;vue拖拽盒子;vue移动;
  7. 赠书 | 如何部署一个Knative Service
  8. linux查看redis内存,Linux查看redis占用内存的方法
  9. SQLite | Case 子句
  10. 2-36进制,可以任意进制互转的类
  11. 从一个小问题洞察挣钱秘籍,却被90%的数据分析师忽略
  12. 设置网页默认浏览IE版本
  13. 前端token是什么?怎么进行封装使用
  14. 截止失真放大电路_基本共射放大电路的特点你懂了吗?
  15. canva怎么组合_教你使用Canvas合成图片
  16. 球半足球分析,瑞典超:哥德堡 VS 代格福什 7月5日
  17. cnpm 淘宝镜像下载安装图文
  18. thinksns java_php-java登录thinksns时的加密解密操作
  19. Inspection info: This inspection detects names that should resolve but don‘t. Due to dynamic dispatc
  20. HDU6356 Glad You Came(2018HDU多校联赛第五场,线段树)

热门文章

  1. day5 Java中的方法与重载
  2. ajax struts 返回html,Struts2+ajax 异步请求,向前段返回字符串
  3. oracle em搭建,【oracle】手动安装EM
  4. 模态识别在计算机视觉应用,相关性学习在计算机视觉任务中的研究与应用
  5. 大学计算机专业绩点3.7什么水平,大学绩点3.0什么水平 大学里的绩点有什么用...
  6. linux变量存储命令,如何将命令存储在shell脚本中的变量中?
  7. mysql的游标处理_mysql 存储过程、游标及逐行处理的配合使用
  8. oracle to_date 大写,oracle账号区分大小写吗2015第一博,Oracle时间段查询,TO_DATE和TO_CHAR使用对比...
  9. kill 进程_05516.1普通用户配置kill CDH集群进程权限
  10. 爱克发胶片_GE AGFA 胶片