面向对象设计思路的形成过程(def方式)

試著忘記壹切 提交于 2020-01-24 20:18:09

首先需要声明的是,本文并不是讲面向对象编程,只是讲面向对象设计的思路。

情景

学校具有开展考试、进行招生等功能,而狗不具备这些能力,医院也没有这些功能,那么在Python中,如何只让学校调用这些功能,而其他东西无法实现呢?如何做到只面向学校这一类呢?

思路

版本一,将某个学校和函数中输出内容完全固定

school = {
    'name': 'UIR',
    'addr': 'Beijing', 
    'types': 'Public School',  # 以上三个为学校的属性
}


def exam():
    print('%s %s %s is having exams' % (school['addr'], school['types'], school['name']))


def recruit():
    print('%s %s %s is recruiting students' % (school['addr'], school['types'], school['name']))


# 让学校开始考试
exam(school)
# 让学校开始招生
recruit(school)

版本二,函数中可以传参,可以传入不同的学校,但是也可以传入猫、司机、公寓等和学校不是同一类的参数

school = {
    'name': 'UIR',
    'addr': 'Beijing',
    'types': 'Public School',  # 以上三个为学校的属性
}


def exam(n):
    print('%s %s %s is having exams' % (n['addr'], n['types'], n['name']))


def recruit(n):
    print('%s %s %s is recruiting students' % (n['addr'], n['types'], n['name']))

# 让学校开始考试
exam(school)
# 让学校开始招生
recruit(school)

版本三,用作用域进行限制,只有学校这一类才能进行考试、招生等功能,但是学校被固定住了

def school():
    def exam(xuexiao):
        print('%s %s %s is having exams' % (xuexiao['addr'], xuexiao['types'], xuexiao['name']))

    def recruit(xuexiao):
        print('%s %s %s is recruiting students' % (xuexiao['addr'], xuexiao['types'], xuexiao['name']))

    xuexiao = {   #这里学校需定义在两个函数的后面,因为这里面用到了到前两个函数
        'name': 'UIR',
        'addr': 'Beijing',
        'types': 'Public School',  # 以上三个为学校的属性
        'exam': exam,
        'recruit': recruit  # 以上两个为学校的功能
    }
    return xuexiao


n = school()
# 取出学校的名字
print(n['name'])
# 让学校开始考试
n['exam'](n)

版本四,在版本三的基础上,只需在school函数中传入不同的值,就换成不同的学校

def school(name, addr, types):
    def exam(xuexiao):
        print('%s %s %s is having exams' % (xuexiao['addr'], xuexiao['types'], xuexiao['name']))

    def recruit(xuexiao):
        print('%s %s %s is recruiting students' % (xuexiao['addr'], xuexiao['types'], xuexiao['name']))

    xuexiao = {
        'name': name,
        'addr': addr,
        'types': types,  # 以上三个为学校的属性
        'exam': exam,
        'recruit': recruit  # 以上两个为学校的功能
    }
    return xuexiao


n = school('UIR', 'Beijing', 'Public School')
# 取出学校的名字
print(n['name'])
# 让学校开始考试
n['exam'](n)

#版本五, 多定义一个初始化函数,初始化一个学校

def school(name, addr, types):
    def exam(xuexiao):
        print('%s %s %s is having exams' % (xuexiao['addr'], xuexiao['types'], xuexiao['name']))

    def recruit(xuexiao):
        print('%s %s %s is recruiting students' % (xuexiao['addr'], xuexiao['types'], xuexiao['name']))

    def init(name, addr, types):  # 这里可以把init函数移到最前面,因为读到最后一个return的时候,前两个函数已经读过了
        xuexiao = {
            'name': name,
            'addr': addr,
            'types': types,  # 以上三个为学校的属性
            'exam': exam,
            'recruit': recruit  # 以上两个为学校的功能
        }
        return xuexiao

    res = init(name, addr, types)
    return res  # 或者这两步直接写成return init(name, addr, types)


n = school('UIR', 'Beijing', 'Public School')
# 取出学校的名字
print(n['name'])
# 让学校开始考试
n['exam'](n)

结语

类是一种数据结构,对象(实例)从类中产生。以上便是面向对象设计思路的形成过程。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!