码迷,mamicode.com
首页 > 其他好文 > 详细

模块和类的通用转换规则(2),如何oo?

时间:2018-03-14 15:15:57      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:实例化   AC   声明   blog   self   imp   color   style   补丁   

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

一个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是函数和传参分离在两个地方。

 

模块和类的通用转换规则(2),如何oo?

标签:实例化   AC   声明   blog   self   imp   color   style   补丁   

原文地址:https://www.cnblogs.com/ydf0509/p/8566932.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!