先看需求:如何描述一条狗?一种是这条狗的独有特征(如名字,性别,类别),还有所有狗都有的行为(吃喝拉撒睡),如何实现呢,独有特征肯定用dict,行为当然是用函数来完成。
dog1={ ‘name‘:‘旺财‘, ‘gender‘:‘母‘, ‘type‘:‘藏獒‘ } person1={ ‘name‘:‘alex‘, ‘gender‘:‘母‘, ‘type‘:‘人‘ } def eat(dog): print(‘%s在吃屎‘%dog[‘name‘]) def jiao(dog): print(‘%s 在叫‘%dog[‘name‘]) jiao(dog1)
但是会有一个问题,人person1,他也可以调用狗的def eat(),def jiao()。如何避免这个问题呢?难道每次调用函数都用 if 判断?
其实根据函数的作用域,可以把函数放到一个大的函数里边,做成子函数,那么外部的人就调用不到了
person1 = { ‘name‘: ‘alex‘, ‘gender‘: ‘母‘, ‘type‘: ‘人‘ } def dog(): def eat(dog): print(‘%s在吃屎‘ % dog[‘name‘]) def jiao(dog): print(‘%s 在叫‘ % dog[‘name‘]) dog1 = { ‘name‘: ‘旺财‘, ‘gender‘: ‘母‘, ‘type‘: ‘藏獒‘, ‘eat‘: eat, ‘jiao‘: jiao } return dog1 dog()[‘jiao‘](dog()) dog()[‘eat‘](dog())
现在还有个问题,就是狗被写死了,名字,性别,类别等都被写死了!如何不写死,当然是根据用户的参数传入来写。
person1 = { ‘name‘: ‘alex‘, ‘gender‘: ‘母‘, ‘type‘: ‘人‘ } def dog(name, gender, type): def eat(dog): # 需要字典dog print(‘%s在吃屎‘ % dog[‘name‘]) def jiao(dog): # 需要字典dog print(‘%s 在叫‘ % dog[‘name‘]) dog1 = { ‘name‘: name, ‘gender‘: gender, ‘type‘: type, ‘eat‘: eat, ‘jiao‘: jiao } return dog1 d1 = dog(‘旺财‘, ‘母‘, ‘藏獒‘) d1[‘eat‘](d1) # 注意,需要的参数是dict,传的参数是自己,返回的就是dog1的dict。
一般独有的特征会放到一个init初始化函数里面
代码就被优化成这样
person1 = { ‘name‘: ‘alex‘, ‘gender‘: ‘母‘, ‘type‘: ‘人‘ } def dog(name, gender, type): def eat(dog): # 需要字典dog print(‘%s在吃屎‘ % dog[‘name‘]) def jiao(dog): # 需要字典dog print(‘%s 在叫‘ % dog[‘name‘]) def init(name,gender,type): dog1 = { ‘name‘: name, ‘gender‘: gender, ‘type‘: type, ‘eat‘: eat, ‘jiao‘: jiao } return dog1 return init(name,gender,type) d1 = dog(‘旺财‘, ‘母‘, ‘藏獒‘) d1[‘eat‘](d1) # 注意,需要的参数是dict,传的参数是自己,返回的就是dog1的dict。
从上面可以看出来:
1.类:是具有相同属性的一类实物的集合。
2.对象:对象是类当中具体的某个物体。
再来一个需求:如何描述一个学校?特征(名字,地址,私立还是公立),动作(招生,考试),根据上面的例子代码应该可以一步到位了。
def school(name,addrs,type): def init(name,addrs,type): school1={ ‘name‘:name, ‘addrs‘:addrs, ‘type‘:type, ‘zhaosheng‘:zhaosheng, ‘kaoshi‘:kaoshi } return school1 def zhaosheng(school): print(‘%s学校正在招生‘%school[‘name‘]) def kaoshi(school): print(‘%s学校正在考试‘%school[‘name‘]) return init(name,addrs,type) school1=school(‘北大‘,‘北京‘,‘私立‘)[‘kaoshi‘](school(‘北大‘,‘北京‘,‘私立‘)) #传的是自己self
上面用函数def完成了一个类,说明
面向对象设计:是将一类具体实物的数据和动作整合到一起。不一定非得用Class,用函数def也可以实现
面向对象编程:用Class+实例/对象的方法去实现面向对象设计。如C++有很多class
原文:https://www.cnblogs.com/liaoyifu/p/14096409.html