• python之面向对象(软件开发过程、反射)


    一、面向对象软件开发的过程

    面向对象的软件工程包括下面几个部:

    1.面向对象分析(object oriented analysis ,OOA)

        软件工程中的系统分析阶段,要求分析员和用户结合在一起,对用户的需求做出精确的分析和明确的表述,从大的方面解析软件系统应该做什么,而不是怎么去做。面向对象的分析要按照面向对象的概念和方法,在对任务的分析中,从客观存在的事物和事物之间的关系,贵南出有关的对象(对象的‘特征’和‘技能’)以及对象之间的联系,并将具有相同属性和行为的对象用一个类class来标识。

        建立一个能反映这是工作情况的需求模型,此时的模型是粗略的。

    2 面向对象设计(object oriented design,OOD)

        根据面向对象分析阶段形成的需求模型,对每一部分分别进行具体的设计。

        首先是类的设计,类的设计可能包含多个层次(利用继承与派生机制)。然后以这些类为基础提出程序设计的思路和方法,包括对算法的设计。

        在设计阶段并不牵涉任何一门具体的计算机语言,而是用一种更通用的描述工具(如伪代码或流程图)来描述。

    3 面向对象编程(object oriented programming,OOP)

        根据面向对象设计的结果,选择一种计算机语言把它写成程序,可以是python。

    4 面向对象测试(object oriented test,OOT)

        在写好程序后交给用户使用前,必须对程序进行严格的测试,测试的目的是发现程序中的错误并修正它。

        面向对的测试是用面向对象的方法进行测试,以类作为测试的基本单元。

    5 面向对象维护(object oriendted soft maintenance,OOSM)

        正如对任何产品都需要进行售后服务和维护一样,软件在使用时也会出现一些问题,或者软件商想改进软件的性能,这就需要修改程序。

        由于使用了面向对象的方法开发程序,使用程序的维护比较容易。

        因为对象的封装性,修改一个对象对其他的对象影响很小,利用面向对象的方法维护程序,大大提高了软件维护的效率,可扩展性高。

        在面向对象方法中,最早发展的肯定是面向对象编程(OOP),那时OOA和OOD都还没有发展起来,因此程序设计者为了写出面向对象的程序,还必须深入到分析和设计领域,尤其是设计领域,那时的OOP实际上包含了现在的OOD和OOP两个阶段,这对程序设计者要求比较高,许多人感到很难掌握。

        现在设计一个大的软件,是严格按照面向对象软件工程的5个阶段进行的,这个5个阶段的工作不是由一个人从头到尾完成的,而是由不同的人分别完成,这样OOP阶段的任务就比较简单了。程序编写者只需要根据OOd提出的思路,用面向对象语言编写出程序既可。

        在一个大型软件开发过程中,OOP只是很小的一个部分。

        对于全栈开发的你来说,这五个阶段都有了,对于简单的问题,不必严格按照这个5个阶段进行,往往由程序设计者按照面向对象的方法进行程序设计,包括类的设计和程序的设计。

    二、反射

    1、什么是反射

    反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。

    2、python面向对象中的反射

    Python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)。

    四个可以实现自省的函数

    下列方法适用于类和对象(一切皆对象,类本身也是一个对象)

    class Teacher:
        school = 'oldboy'
        def __init__(self,name,age):
            self.name = name
            self.age = age
        def teach(self):
            print('%s i teaching'%self.name)
    '''
    定义一个老师的类
    有3个数据属性,1个函数属性
    '''

    hasattr(object,name)  判断object中有没有一个name字符串对应的方法或属性。

    print(hasattr(Teacher,'school'))    #判断Teacher中是否有school
    print(hasattr(Teacher,'teach'))    #判断Teacher中是否有teach
    '''
    True
    True
    '''

    getattr(object, name, default=None)  从object中取一个name字符串对应的方法或属性,没有返回default

    print(getattr(Teacher,'school',-1))
    print(getattr(Teacher,'teach',-1))
    print(getattr(Teacher,'student',-1))
    '''
    oldboy
    <function Teacher.teach at 0x000000000280BB70>
    -1
    '''

    setattr(x, y, v)  将对象x中的字符串为y的属性设置为v   setattr(x, 'y', v) is equivalent to “x.y=v”'

    print(getattr(Teacher,'school',-1))
    setattr(Teacher,'school',123)
    print(Teacher.school)
    '''
    oldboy
    123
    '''

    delattr(x, y)  将对象x中的字符串为y的属性删除   delattr(x, 'y') is equivalent to “del x.y”

    print(getattr(Teacher,'school',-1))
    delattr(Teacher,'school')
    print(hasattr(Teacher,'school'))
    '''
    oldboy
    False
    '''
  • 相关阅读:
    矩阵补全(Matrix Completion)和缺失值预处理
    【机器学习基础】对 softmax 和 cross-entropy 求导
    Mendeley使用小技巧
    [Active Learning] Multi-Criteria-based Active Learning
    回归树(Regression Tree)
    Typora + Mathpix Snip,相见恨晚的神器
    【机器学习之数学】02 梯度下降法、最速下降法、牛顿法、共轭方向法、拟牛顿法
    【机器学习之数学】01 导数、偏导数、方向导数、梯度
    “卷积神经网络(Convolutional Neural Network,CNN)”之问
    一篇带你完全掌握线程的博客
  • 原文地址:https://www.cnblogs.com/fenglinglf/p/7133509.html
Copyright © 2020-2023  润新知