python的面向对象-面向对象设计
1、面向对象设计
def school(name,addr,type):#定义一个大函数的作用就是不能让狗调用学校的方法 #学校动作 def kaoshi(school): print("[%s]学校正在考试" %school["name"]) def zhaosheng(school): print("[%s]学校[%s]正在招生" %(school["type"],school["name"])) #学校特征 sch = { "name": name, "addr": addr, "type": type, "kaoshi":kaoshi, "zhaosheng":zhaosheng, } return sch#返回的是一个字典里面包含特征和kaoshi zhaosheng的内存地址 s1=school("清华","北京","公立")#运行school这个大函数,把返回值的字典赋值给s1 print(s1) s1["kaoshi"](s1)#运行kaoshi这个函数,把s1自己作为参数穿进去,取值到kaoshi是s1["kaoshi"]加()就是运行函数 s2=school("北大","北京","公立") print(s2) s2["zhaosheng"](s2) C:\python35\python3.exe D:/pyproject/day24/面向对象设计学习.py {'zhaosheng': <function school.<locals>.zhaosheng at 0x0000000000B22400>, 'type': '公立', 'kaoshi': <function school.<locals>.kaoshi at 0x0000000000B22378>, 'addr': '北京', 'name': '清华'} [清华]学校正在考试 {'zhaosheng': <function school.<locals>.zhaosheng at 0x0000000000B22510>, 'type': '公立', 'kaoshi': <function school.<locals>.kaoshi at 0x0000000000B22488>, 'addr': '北京', 'name': '北大'} [公立]学校[北大]正在招生
2、定义一个init初始化函数,但是不够好,
def school(name,addr,type):#定义一个大函数的作用就是不能让狗调用学校的方法 #学校动作 def kaoshi(school): print("[%s]学校正在考试" %school["name"]) def zhaosheng(school): print("[%s]学校[%s]正在招生" %(school["type"],school["name"])) #学校特征 def init(name,addr,type): sch = { "name": name, "addr": addr, "type": type, "kaoshi": kaoshi, "zhaosheng": zhaosheng, } return sch#返回的是一个字典里面包含特征和kaoshi zhaosheng的内存地址 res=init(name,addr,type)#上面定义了3个子函数,但是没有运行,res是在运行init return res#然后把字典这个结果作为school这个大函数的返回值 s1=school("清华","北京","公立")#运行school这个大函数,把返回值的字典赋值给s1 s1["kaoshi"](s1)#运行kaoshi这个函数,把s1自己作为参数穿进去,取值到kaoshi是s1["kaoshi"]加()就是运行函数 s2=school("北大","北京","公立") s2["zhaosheng"](s2) C:\python35\python3.exe D:/pyproject/day24/面向对象设计学习.py [清华]学校正在考试 [公立]学校[北大]正在招生
3、可以把上面的res这2行合并为一行
运行school函数,把3个def子函数加载到内存中,然后运行init初始化函数,把结果(结果是一个字典)作为school的返回值返回
def school(name,addr,type):#定义一个大函数的作用就是不能让狗调用学校的方法 #学校动作 def kaoshi(school): print("[%s]学校正在考试" %school["name"]) def zhaosheng(school): print("[%s]学校[%s]正在招生" %(school["type"],school["name"])) #学校特征 def init(name,addr,type): sch = { "name": name, "addr": addr, "type": type, "kaoshi": kaoshi, "zhaosheng": zhaosheng, } return sch#返回的是一个字典里面包含特征和kaoshi zhaosheng的内存地址 return init(name,addr,type) s1=school("清华","北京","公立")#运行school这个大函数,把返回值的字典赋值给s1 s1["kaoshi"](s1)#运行kaoshi这个函数,把s1自己作为参数穿进去,取值到kaoshi是s1["kaoshi"]加()就是运行函数 s2=school("北大","北京","公立") s2["zhaosheng"](s2) C:\python35\python3.exe D:/pyproject/day24/面向对象设计学习.py [清华]学校正在考试 [公立]学校[北大]正在招生
4、上面这样还不够好,因为init初始化函数一般都是放在最前面的,我们开始的时候放在前面会报错,因为找不到kaoshi和zhaosheng,现在放在前面是可以的了,因为def只是定义函数,并没有运行,到最下面的时候运行的时候这时候zhaosheng和kaoshi已经加载到内存中了
def school(name,addr,type):#定义一个大函数的作用就是不能让狗调用学校的方法 def init(name,addr,type):#初始化 sch = { "name": name, "addr": addr, "type": type, "kaoshi": kaoshi, "zhaosheng": zhaosheng, } return sch#返回的是一个字典里面包含特征和kaoshi zhaosheng的内存地址 #学校动作 def kaoshi(school): print("[%s]学校正在考试" %school["name"]) def zhaosheng(school): print("[%s]学校[%s]正在招生" %(school["type"],school["name"])) #学校特征 return init(name,addr,type) s1=school("清华","北京","公立")#运行school这个大函数,把返回值的字典赋值给s1 s1["kaoshi"](s1)#运行kaoshi这个函数,把s1自己作为参数穿进去,取值到kaoshi是s1["kaoshi"]加()就是运行函数 s2=school("北大","北京","公立") s2["zhaosheng"](s2) C:\python35\python3.exe D:/pyproject/day24/面向对象设计学习.py [清华]学校正在考试 [公立]学校[北大]正在招生
5、面向对象编程就是用class独特的语法去实现面向对象设计
#用面向对象编程独有的语法class去实现面向对象设计
class Dog: def __init__(self,name,gender,type): self.name=name self.gender=gender self.type=type def bark(self): print('一条名字为[%s]的[%s],狂吠不止' %(self.name,self.type)) def yao_ren(self): print('[%s]正在咬人' %(self.name)) def chi_shi(self): print('[%s]正在吃屎' %(self.type)) dog1=Dog('beiye','female','京巴') print(dog1.__dict__) {'gender': 'female', 'type': '京巴', 'name': 'beiye'}