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

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

一个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

时间: 2024-11-04 05:35:11

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

一步一步学会puppet(二)--模块和类

上一篇主要介绍了puppet的基本工作原理和资源的相关初步使用: 这一篇主要介绍puppet中很重要的2个概念:模块和类: =================================================================== 1 模块 1.1 需求 1.2 定义 1.3 详细说明 1.4 模块的目录组织结构 1.5 模块管理 2 类 2.1 定义 2.2 详细说明 2.3 类的分类 2.4 类的声明 2.5 实例 ========================

大气智能家居家具装修装饰类企业通用网站织梦模板【dedecms模板】

模板名称:大气智能家居家具装修装饰类企业通用网站织梦模板模板介绍:织梦最新内核开发的模板,适合智能家居家具企业,也可以通用装修行业等企业使用,页面简洁简单,容易管理,DEDE5.5内核以上都可以使用:附带测试数据! 模板特点:1:智能家居家具展示公司模板,代码简洁,风格大气简单,页面干净.2:首页带炫酷的幻灯片,产品展示,新闻展示.3:网站内容都能在后台修改,后台简单易学.4:后台直接修改联系方式.地址.版权信息,网站内容等,修改更加方便. 使用程序:织梦DEDECMS5.5以上版本都可以使用.

基于类的通用视图

基于类的通用视图 前面我们说过了django的通用视图,不知道django通用视图的去看我前面的随笔,谢谢 django的通用视图帮我们省略了很多代码,但有时候django的通用视图并不能满足我们全部的需求,例如像重定义一些属性和方法的时候,或者我们想换种写法的时候,因此,django提供了基于类的通用视图,通过子类或者在url中传参的方法来配置我们的基于类的通用视图 通用视图和基于类的通用视图是两种不一样的写法,前面我们介绍的通用视图,所有的代码集中于url的配置文件中,而基于类的通用视图主要

js模块,类,继承,命名空间,私有属性等相关概念梳理

js确切的说是一种基于对象的语言,和纯面向对象的语言(比如as)稍微有点区别,js中没有类的概念.虽然有继承但是基于原型的继承.随着前段越来越受重视,jser们利用js的一些特性他们制造出了和纯面向对象一样好玩的东西.下面就js中一些概念进行概述,很多东西都是来自博客园的一些大牛,我写这篇文章主要想拿as和js做对比来讲,以方便as像转js的程序员们.本片文章涉及的概念有,模块,类,继承,私有属性和公开属性. 1.模块大家写as的时候都知道,as里面是有类的概念,每次生成一个类,系统中都会多一个

【P000-009】分析模块——四大类

仅仅将分析模块按实际惯例简单分成价值和价格两类看来并不准确.一家公司便宜绝对不等于能赚钱,公司所对应的股票也不会因为公司现在赚钱(亏钱)就一定涨(跌),当然长期来看,股票价格运行是与公司效益成正比的.也就是俗话说 (短期)市场的错误,和(长期)市场的正确. 不过这个展开来说又复杂了,抽象建模要的就是化繁为简,先打住. 公司战略,市场环境,投资倾向什么的全部屏蔽,我们现在要的只是一些数据 一.这些数据按来源可以分为两个部分 1.来自于公司 2.来自于(二级)市场(交易市场) 二.而按照时间连续性也

模块、类和对象(python学习笔记)

模块.类和对象 1.字典,记住键值对的概念,记住从键值对 mystuff = {'apple':"I am apples"} print mystuff['apple'] 2.模块 ''' 模块 1.模块是包含函数和变量的文件 2.模块这个文件可以被导入 3.可以使用.操作符访问模块中的函数和变量 ''' #模块代码示例 #以下是一个模块,名字叫mystuff.py # this goes in mustuff.py def apple(): print("I am a ap

python附录-builtins.py模块str类源码(含str官方文档链接)

python附录-builtins.py模块str类源码 str官方文档链接:https://docs.python.org/3/library/stdtypes.html#text-sequence-type-str builtins.py class str(object): """ str(object='') -> str str(bytes_or_buffer[, encoding[, errors]]) -> str Create a new stri

【Python基础】lpthw - Exercise 40 模块、类和对象

一. 模块(module) 模块中包含一些函数和变量,在其他程序中使用该模块的内容时,需要先将模块import进去,再使用.操作符获取函数或变量,如 1 # This goes in mystuff.py 2 def apple(): 3 print("This is an apple.") 4 5 pear = "This is a pear." 1 import mystuff as ms 2 ms.apple() 3 4 print(ms.pear) 输出为

<python>模块、类、对象

Python 是一种“面向对象编程语言(Object Oriented Programming Language)”.这个说法的意思是说, Python 里边有一种叫做 class 的结构,通过它你可以用一种特殊的方式构造你的软件.通过使用 class(类),你可以让你的程序架构更为整齐,使用起来也会更为干净——至少理论上应该是这样的. 现在我要教你的是面向对象编程的起步知识,我会用你学过的知识向你介绍面向对象编程.类.以及对 象.问题是变相对象编程(简称OOP)本身就是个奇怪的东西,你只有努力