1.什么是面向对象
将数据与功能绑定到一起的操作起名为面向对象编程,将特定的数据与特定的功能绑定到一起 将来只能彼此相互使用。
2.面向对象推导
举例:人狗大战
def get_person(name, gender, age, p_type, attack_val, life_val): # 定义人 person_obj = { 'name': name, 'gender': gender, 'age': age, 'p_type': p_type, 'attack_val': attack_val, 'life_val': life_val } return person_obj def get_dog(name, d_type, attack_val, life_val): # 定义狗 dog_obj = { 'name': name, 'd_type': d_type, 'attack_val': attack_val, 'life_val': life_val } return dog_obj def person_attack(person_obj, dog_obj): # 定义人捶打狗 print('即将被攻击的狗:%s 当前血量:%s'%(dog_obj.get('name'),dog_obj.get('life_val'))) # 先展示当前狗的状态 dog_obj['life_val'] -= person_obj.get('attack_val') # 人锤狗 直接用狗的生命值减去人的攻击力 print('人:%s 锤了 狗:%s 狗掉血:%s 剩余血量:%s' % ( person_obj.get('name'), dog_obj.get('name'), person_obj.get('attack_val'), dog_obj.get('life_val'))) def dog_attack(dog_obj, person_obj): # 定义狗咬人 print('即将被攻击的人:%s 当前血量:%s' % (person_obj.get('name'), person_obj.get('life_val'))) # 先展示当前人的状态 person_obj['life_val'] -= dog_obj.get('attack_val') # 狗咬人 直接用人的生命值减去狗的攻击力 print('狗:%s 咬了 人:%s 人掉血:%s 剩余血量:%s' % ( dog_obj.get('name'), person_obj.get('name'), dog_obj.get('attack_val'), person_obj.get('life_val'))) # 调用产生人和狗的函数 p1 = get_person('小明', 'male', 88, '猛男', 20000, 20000) p2 = get_person('小红', 'female', 18, '淑女', 100, 2000) d1 = get_dog('旺财', '哈士奇', 8000, 8000) d2 = get_dog('来福', '泰迪', 200, 500) # 调用攻击彼此的函数 person_attack(d1, p1) dog_attack(p2, d2)
运行结果:
ps:上述代码当狗调用人打狗函数或者人调用狗咬人函数的话就会出现第二个运行结果,所以为了规定好谁只能谁调用这样就不会混。
4.代码优化
将人和人攻击狗的函数进行绑定,狗跟狗攻击人的函数进行绑定
def get_person(name, gender, age, p_type, attack_val, life_val): def person_attack(person_obj, dog_obj): print('即将被攻击的狗:%s 当前血量:%s' % (dog_obj.get('name'), dog_obj.get('life_val'))) # 先展示当前狗的状态 dog_obj['life_val'] -= person_obj.get('attack_val') # 人锤狗 直接用狗的生命值减去人的攻击力 print('人:%s 锤了 狗:%s 狗掉血:%s 剩余血量:%s' % ( person_obj.get('name'), dog_obj.get('name'), person_obj.get('attack_val'), dog_obj.get('life_val'))) person_obj = { 'name': name, 'gender': gender, 'age': age, 'p_type': p_type, 'attack_val': attack_val, 'life_val': life_val, 'person_attack':person_attack } return person_obj def get_dog(name, d_type, attack_val, life_val): def dog_attack(dog_obj, person_obj): print('即将被攻击的人:%s 当前血量:%s' % (person_obj.get('name'), person_obj.get('life_val'))) # 先展示当前人的状态 person_obj['life_val'] -= dog_obj.get('attack_val') # 狗咬人 直接用人的生命值减去狗的攻击力 print('狗:%s 咬了 人:%s 人掉血:%s 剩余血量:%s' % ( dog_obj.get('name'), person_obj.get('name'), dog_obj.get('attack_val'), person_obj.get('life_val'))) dog_obj = { 'name': name, 'd_type': d_type, 'attack_val': attack_val, 'life_val': life_val, 'dog_attack':dog_attack } return dog_obj p1 = get_person('小明', 'male', 88, '猛男', 20000, 20000) p2 = get_person('小红', 'female', 18, '淑女', 100, 2000) d1 = get_dog('旺财', '哈士奇', 8000, 8000) d2 = get_dog('来福', '泰迪', 200, 500) p1.get('person_attack')(p1, d1) p1.get('person_attack')(p2, d2)
运行结果:
ps:我们定义的函数默认情况下都是可以被任意调用的 但是现在我们想实现定义的函数只有特定的东西才可以调用。
1.面向过程编程
把完成某一程序的 所有步骤 从头到尾 逐步实现
截止目前我们写的都是面向过程编程:注册功能、登陆功能、购物车+ATM项目
2.面向对象编程
面向对象中'对象'其实就是一个容器,里面将数据和功能绑定到了一起
只负责创造人物功能后续的具体实现什么结果就不需要负责:游戏人物开发
ps:两种编程思想没有优劣,用户需要更具具体使用场景选择编程方式,很多时候甚至是两者混合使用。
1.对象与类的概念
对象:数据与功能的结合体,记录多个对象不同的数据和功能
类:多个对象相同的数据和功能体的结合,记录多个对象相同的数据和功能
2.对象与类的创建
创建类的完整语法:
class People: # 对象公共的数据 # 对象公共的方法 1.class定义类的关键字 2.People是类的名字(类名的命名和变量名一致 推荐首字母大写) 3.类体代码在类定义阶段就会执行
class People: features = 'eye' features1 = 'nose' def conducted_activity(self): print('正在吃饭')
People.__dict__:查看名称空间
People.features:用字典的键取对应的值
People.conducted_activity:获取名字
stu1 = People() print(stu1.features) # 类实例化产生对象 print(stu1.conducted_activity) stu1.features = 'mouth' # 修改features键对应的值
3.对象独有的数据
class People: def __init__(self, name, age, gender): self.name = name # self.__dict__['name'] = name self.age = age # self.__dict__['age'] = age self.gender = gender # self.__dict__['gender'] = gender race = 'Asian' # 公共数据 def conducted_activity(self): print('正在吃饭') stu1 = People('小明', 18, 'male') print(stu1.__dict__) stu2 = People('小强', 20, 'male') print(stu2.__dict__) '''打印结果 {'name': '小明', 'age': 18, 'gender': 'male'} {'name': '小强', 'age': 20, 'gender': 'male'} '''
ps:直接利用__dict__方法朝字典添加键值对可以简写成直接句点符,init函数是专用给对象创建独有的数据 其他对象不能调用>>>:面向对象思想 将数据和功能整合到一起。