介绍模块和类怎么互相转换,不谈面向对象的继承 封装 多态等特点。
一个person_module模块,有人的基本属性和功能。
person_module.py如下
# coding=utf8 name = ‘小明‘ eye_color = ‘blue‘ age = 10 def get_eye_color(): return name + ‘的眼睛颜色是: ‘ + eye_color def 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 += 2 print p.age show_age() p.grow = grow print p.get_eye_color() show_age() p.grow() # 直接grow()也可以
可以看到属性被替换了,连增长函数也被替换了,一次增长两岁。
这就是给模块打猴子补丁了,这样写很别扭的实现了模块继承,类似于类继承。
希望把这个模块转换成类,oop编程。
模块和类的转换规则是:
1、全局变量改成实例属性,全局的不会被改变的变量类似于那种const的,可以写成类属性(减少点内存存储可以)。
2、然后把函数改成方法。方法是类里面的,函数是模块里面的。
看person.py
# coding=utf8 class Person(object): def __init__(self, name, age,eye_color): self.name = name self.eye_color = eye_color self.age = age def get_eye_color(self): return self.name + ‘的眼睛颜色是: ‘ + self.eye_color def show_age(self): print self.name + ‘的年龄是: ‘ + str(self.age) def grow(self): print self.name + ‘ 增长一岁了‘ self.age += 1 self.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一些。非oop一些设计模式很难用上。
一个模块内可以多个类,类可以把模块分割裂更小的模块组织单元。如果担心oo性能比op差,那一样可以写类里面的静态方法或者类方法,这样类是工具类,无需实例化。
这是一些体会,po和oo每次写时候顺便脑补一下,另一种大概是怎么样的。全局变量太多,多个函数操作一个东西,就可以想下oop,oo能消灭全局。模块级的po是拿个源码脚本,到处去修改一些变量的值,例如age name什么的。类是对数据和方法的封装,op是函数和传参分离在两个地方。
原文地址:https://www.cnblogs.com/ydf0509/p/8566932.html