初来吾爱,这里转载一篇我在其他博客网站的文章。首先需要声明的是,本文并不是讲面向对象编程,只是讲面向对象设计的思路。
情景
学校具有开展考试、进行招生等功能,而狗不具备这些能力,医院也没有这些功能,那么在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)
结语
类是一种数据结构,对象(实例)从类中产生。以上便是面向对象设计思路的形成过程。