介绍模块和类怎么互相转换,不谈面向对象的继承 封装 多态等特点。

一个person_module模块,有人的基本属性和功能。

person_module.py如下

# coding=utf8
name = '小明'
eye_color = 'blue'
age = 10def get_eye_color():return name + '的眼睛颜色是: ' + eye_colordef show_age():print   name + '的年龄是: ' + str(age)def grow():print name + ' 增长一岁了'globals()['age'] += 1   ##这里要注意一定要这样写活着声明age是全局的,否则会出错print globals()['age']show_age()if __name__ == "__main__":print get_eye_color()show_age()grow()

现在假如这个模块是别人写的,我们拿来用,现在我们要把名字换成小红,眼睛颜色换成黑色,年龄换成15岁,成长函数,一次增加两岁

那我们就需要修改别人的源码文件了,可能改着改着改错了,不知道怎么复原了。

那就import这个模块吧。

xiaohong.py

# coding=utf8
import person_module as p
from person_module import *p.name = '小红'
p.age = 14
p.eye_color = 'black'def grow():print p.name + ' 增长一岁了'p.age += 2print p.ageshow_age()
p.grow = growprint p.get_eye_color()
show_age()
p.grow()   # 直接grow()也可以

可以看到属性被替换了,连增长函数也被替换了,一次增长两岁。

这就是给模块打猴子补丁了,这样写很别扭的实现了模块继承,类似于类继承。

希望把这个模块转换成类,oop编程。

模块和类的转换规则是:

1、模块级降为类

2、全局变量改成实例属性,全局的不会被改变的变量类似于那种const的,可以写成类属性(减少点内存存储可以)。

3、然后把函数改成方法。方法是类里面的,函数是模块里面的。

看person.py

# coding=utf8
class Person(object):def __init__(self, name, age,eye_color):self.name = nameself.eye_color = eye_colorself.age = agedef get_eye_color(self):return self.name + '的眼睛颜色是: ' + self.eye_colordef show_age(self):print self.name + '的年龄是: ' + str(self.age)def grow(self):print self.name + ' 增长一岁了'self.age += 1self.show_age()if __name__ == "__main__":xiaohong = Person('小红', 14, 'black')print xiaohong.get_eye_color()xiaohong.show_age()xiaohong.grow()

这样做了之后,统一通过self就能访问age name了,改变age也不需要蛋疼的声明一下age是全局的那个了。
就这样三个步骤,就能把面向过程的模块改成面向对象了。

最主要是前面那种导入模块的方法,打补丁很麻烦,那例子还只是实现小红,如果要实现小黄、小花,那就复杂了。如果使用oop,类的多个实例就自然多了,也简单直观。

如果要改变grow方法,继承一下就行了,改成这样

大部分入门都是第一种写法,毕竟py编程太自由了,可以一条条从上往下指令平铺,也可以抽成函数,也可以oop。用py会长期形成了懒惰的写法用前面第一种,但复用性真的比oop差很多,总体看起来也low一些。比如多个过程需要共享中间状态时,单纯的使用函数会写得很糟糕,这时候就应当使用类,否则要么搞全局变量要么频繁的return频繁的传参,为什么反对模块编程,就是因为模块难以初始化赋值,模块的多实例难以搞,类能很好解决。非oop一些设计模式很难用上。也有人坚决说他不需要oop,说不需要那是没认真对比过,或者压根不了解,只是死记硬背类的 继承 封装多态这几个词语,并没有实践对比过。还有的说python里面一切皆是对象,所以他写的就是oop,没错,那样仅限于有int 类 str类 字典类 或者导入了三方库后有了Request类 Response类,selenim的webdriver的Chrome类 Firefox类,仅限于此啊,没有自己的类,python一切皆对象(在py里面随便写个 a = 5,a就可以说是int类的一个实例了,py是面向对象的极致,甚至比java还极致,java里面的int a = 5,a是基本数据类型,要用到一些必要的方法支持还的把a转成Interger类的对象,php里面的字符串操作是由函数完成的,php的小写字符串转大写是 strtoupper("Hello WORLD!"),py的小写转大写是“Hello WORLD!”.uper(),object.func()和func(object)就是op和oo的区别。除了py里面的例如__len__用,len(str1)来获取长度,但这种是通过反射完成,也可以用str.__len__(),len(str)形式上看起来不那么oo。)虽然py一切皆对象,py是最极致的面向对象,但这不代表随便写就是oop编程了。三方库为什么调用的那么爽,那是人家oop了,人家三方库全写函数,调用起来就知道什么叫痛苦了,都不知道应该调用哪些函数来处理那个对象了。这都什么年代了,还对oop持怀疑和反对态度。php py js es6都是在慢慢的后来加入类的概念,难道发明语言的人会比我们差吗。

必须对py的oop非常熟悉,才能开始学习java。不然的是肯定看不懂java。

一个模块内可以多个类,类可以把模块分割裂更小的模块组织单元。oo大量实例化时候需要占用更多的内存,性能是比op差。如果担心oo性能比op差,那一样可以适当地写类里面的静态方法或者类方法,无需实例化,常用的工具方法不要全写成实例方法,干个啥都要实例化,该用静态就要用静态。

这是一些体会,po和oo每次写时候顺便脑补一下,另一种大概是怎么样的。全局变量太多,多个函数操作一个东西,就可以想下oop,oo能消灭全局,平铺式的代码适合简单脚本,或者快速验证和测试或者顶层脚本,但如果是作为被导入模块,再用这种写法,模块里面大量写非final类型的全局变量是很脑残的低级入门写法。模块级的po是拿个源码脚本,到处去修改一些变量的值,例如age name什么的。oo是对数据和方法的封装,op是函数和传参分离在两个地方。

以上为简单例子,oop的进阶是设计模式。

如果不是按照这种写人的方式,全局变量加函数的面向过程写法,而是完全的没有全局变量一步步return和传参的,执行三步走那就是只有class外壳的类,仍然是一个面向过程的类,需要再加一步。

关于pythoh面向过程开发人员三步转面向对象的补充,再加一步,四步走战略。转面向对象也可以有固定公式。

python模块和类的通用转换规则(2),三步转oo相关推荐

  1. Python模块与类

    2019独角兽企业重金招聘Python工程师标准>>> 类 类的定义,继承 类中的属性,类属性和实例属性的区别及访问方式 变量名以"_"或"__&quo ...

  2. python模块和类_Python类、模块、包的区别

    类 类的概念在许多语言中出现,很容易理解.它将数据和操作进行封装,以便将来的复用. 模块 模块,在Python可理解为对应于一个文件.在创建了一个脚本文件后,定义了某些函数和变量.你在其他需要这些功能 ...

  3. python模块和类和方法_Python类、模块、包的区别

    类 类的概念在许多语言中出现,很容易理解.它将数据和操作进行封装,以便将来的复用. 模块 模块,在Python可理解为对应于一个文件.在创建了一个脚本文件后,定义了某些函数和变量.你在其他需要这些功能 ...

  4. python模块与类的区别_Python类、模块、包的概念及区别

    类 类的概念在许多语言中出现,是面向对象编程的基础,很容易理解.抽象出不同物体的共同特征,根据相似性原则,把彼此相似的物体归于相同的类概念, 它将数据和操作进行封装,以便将来的复用. 模块 模块,在 ...

  5. python 如何判断一个函数执行完成_三步搞定 Python 中的文件操作

    当程序运行时,变量是保存数据的好方法,但变量.序列以及对象中存储的数据是暂时的,程序结束后就会丢失,如果希望程序结束后数据仍然保持,就需要将数据保存到文件中. Python 提供了内置的文件对象,以及 ...

  6. python资料库-Python对接六大主流数据库,只需三步

    作为近两年来最火的编程语言的python,受到广大程序员的追捧必然是有其原因的,如果要挑出几点来讲的话,第一条那就python语法简洁,易上手,第二条呢? 便是python有着极其丰富的第三方的库. ...

  7. 【转载】Python对接六大主流数据库,只需三步

    转载网址: https://developer.51cto.com/art/201907/600444.htm Mysql 安装pymysql Oracle python中对接oracle数据库,使用 ...

  8. JAVA 基本语法 Scanner类的使用 实现步骤 三步走(Scanner)

    Scanner类 实现步骤: 导包 Scanner 实例化 调用Scanner类的相关方法 1.导包: 首先导包是需要在类的前面加如 import java.util.Scanner; import ...

  9. 系统学习Python——模块和包:Python程序架构

    实际上,程序通常涉及不只一个文件.除了最简单的脚本之外,程序一般将采用多文件系统的形式,即使能够自己编写单个文件,也一定会使用到其他人已经写好的外部文件. Python程序架构是将一个程序分割为源代码 ...

最新文章

  1. Qt学习笔记之样式表
  2. java spring eventbus_spring集成guava的event bus
  3. 不属于python的数据类型_下列________不是Python的数据类型。
  4. BZOJ 1013: [JSOI2008]球形空间产生器sphere( 高斯消元 )
  5. 2014河北廊坊计算机一级,2018年上半年河北省廊坊市计算机等级考试简章
  6. AcWing 4242. 货币兑换(SPFA or Bellman 判正权环)
  7. C#list转JSON(Newtonsoft.Json.dll)(仅做记录)
  8. 推荐多款好看的报表表单配色方案
  9. count计时器java,倒计时器CountDownLatch
  10. 第四届全国大学生GIS应用技能大赛试题参考答案(上午第2套)
  11. html未响应是什么原因,ie浏览器未响应如何解决
  12. Lesson 43 Smart 组件 vs Dumb 组件
  13. 计算机通信中应用的调制解调与无线电通信,计算机通讯中的一对搭档——调制解调器和通讯软件...
  14. 阿里巴巴、腾讯、百度和京东金融落户雄安新区 | 亚马逊加入FB与微软阵营,共同支持开源AI平台ONNX
  15. androidx和android的区别,Android X 详解
  16. 你应该知道的50个项目管理术语(上)
  17. 物联网应用技术专业是属于什么类
  18. 金陵专转本计算机应用,“专转本”计算机应用基础试题
  19. iPhone4S降级至iOS6
  20. html5获取图形坐标,WKWebView获取H5页面里图片地址以及图片相对视图窗口的坐标的方法...

热门文章

  1. 火柴人小程序linux,这里居然有火柴人的一些不一样的小程序?要不来玩一下
  2. 多模型算法理论推导过程
  3. VR+消防应急演练制作
  4. 怎样申请入驻快手mcn ?
  5. Jquery的animate()反应过慢的问题解决
  6. Hadoop3.2.1 【 HDFS 】源码分析 : ZKFailoverController解析
  7. Hibernate - 单向一对多关联关系映射
  8. Matrix源码分析————IO Canary
  9. 操作系统中PV操作实现进程同步与互斥问题(以苹果橘子问题为例)
  10. 重读《C primer plus》(八)