Python面向对象详解

一、面向对象前戏

	奥特曼打怪兽
	根据我们目前所学的知识一步一步推导
	我们都知道奥特曼有名字、性别、技能、变身时间(血量)每个人都不一样 怪兽肯定也是如此了

	1.创造出 奥特曼和怪兽(利用所学的数据类型字典较为合适)
	
		Ultraman1 = {  # 使用字典模拟奥特曼
			'name': 'Tiga',
			'gender': 'man',
			'ability_dps': 999,				# 技能伤害
			'blood_volume': 2000			# 血量
			}
		
		Monster1 = {  # 使用字典模拟
			'name': 'Zetton',
			'gender': 'man',
			'ability_dps': 555,				# 技能伤害
			'blood_volume': 1499			# 血量
			}
	
	'''由于定义奥特曼和怪兽的字典基本不变 但是在很多地方又需要反复使用 所以封装成函数方便简洁'''

	2.创建奥特曼怪兽函数
	
		def get_Ultraman(name, gender, ability_dps, blood_volume):	# 奥特曼函数 传值即可获得一个奥特曼
			Ultraman_obj = {
				'name': name,
				'gender': gender,
				'ability_dps': ability_dps,				# 技能伤害
				'blood_volume': blood_volume			# 血量
				}
			return Ultraman_obj

		def get_Monster(name, gender, ability_dps, blood_volume):	# 怪兽函数 传值即可获得一个怪兽
			Monster_obj = {
				'name': name,
				'gender': gender,
				'ability_dps': ability_dps,				# 技能伤害
				'blood_volume': blood_volume			# 血量
				}
			return Monster_obj

		U1 = get_Ultraman('Tiga', 'man', 999, 2000)			# 随机一个奥特曼
		M1 = get_Monster('Zetton', 'man', 555, 1499)			# 获得一个怪兽

		'''让人和狗具备攻击的能力 本质其实就是定义两个函数供人和狗调用'''

	3.定义攻击函数

		def Ultraman_attack():
			print('即将被攻击的怪兽:%s 当前血量:%s' % (Monster_obj.get('name'), Monster_obj.get('blood_volume')))  # 先展示当前怪兽的状态
			Monster_obj['blood_volume'] -= Ultraman_obj.get('ability_dps')  # 奥特曼锤怪兽 直接用怪兽的生命值减去奥特曼的技能伤害
			print('奥特曼:%s 锤了 怪兽:%s 怪兽掉血:%s 剩余血量:%s' % (Ultraman_obj.get('name'), Monster_obj.get('name'), Ultraman_obj.get('ability_dps'), Monster_obj.get('blood_volume')))
			
		ultraman_attack(U1, M1)	# 奥特曼去攻击怪兽

		'''奥特曼可以去攻击怪兽 怪兽也可以去攻击奥特曼 此处怪兽攻击省略'''

在这里插入图片描述

二、代码优化

	4.奥特曼和怪兽的技能乱套
		目前奥特曼和怪兽的函数 可以被任意调用
		奥特曼可以调用怪兽技能 怪兽可以调用奥特曼的函数

在这里插入图片描述

	5.奥特曼跟奥特曼攻击怪兽的函数绑定 怪兽跟怪兽攻击奥特曼的函数绑定
		我们定义的函数默认情况下都是可以被任意调用的
		但是现在我们想实现定义的函数只有特定的东西才可以调用
		def get_ultraman(name, gender, ability_dps, blood_volume):		# 奥特曼函数 传值即可获得一个奥特曼
			def ultraman_attack(ultraman_obj, monster_obj):
				print('即将被攻击的怪兽:%s 当前血量:%s' % (monster_obj.get('name'), monster_obj.get('blood_volume')))  # 先展示当前怪兽的状态
				monster_obj['blood_volume'] -= ultraman_obj.get('ability_dps')  # 奥特曼锤怪兽 直接用怪兽的生命值减去奥特曼的技能伤害
				print('奥特曼:%s 锤了 怪兽:%s 怪兽掉血:%s 剩余血量:%s' % (ultraman_obj.get('name'), monster_obj.get('name'), ultraman_obj.get('ability_dps'), monster_obj.get('blood_volume')))
		
			ultraman_obj = {
				'name': name,
				'gender': gender,
				'ability_dps': ability_dps,				# 技能伤害
				'blood_volume': blood_volume,			# 血量
				'ultraman_attack': ultraman_attack
				}
			return ultraman_obj
		
		
		def get_monster(name, gender, ability_dps, blood_volume):		# 怪兽函数 传值即可获得一个怪兽
			monster_obj = {
				'name': name,
				'gender': gender,
				'ability_dps': ability_dps,				# 技能伤害
				'blood_volume': blood_volume			# 血量
				}
			return monster_obj
		
		
		U1 = get_ultraman('Tiga', 'man', 999, 2000)
		M1 = get_monster('Zetton', 'man', 555, 1499)
		
		U1.get('ultraman_attack')(U1, M1)

		'''所以这个时候攻击都是奥特曼和怪兽的局部空间函数 所以只能奥特曼调奥特曼 怪兽调怪兽'''
		'''怪兽去调奥特曼就是在全局和内置中查找 找不到 所以只能调自己'''

在这里插入图片描述

三、总结

	将奥特曼的数据和奥特曼的功能(技能)绑定到一起
		只有奥特曼可以调到奥特曼的功能
	将怪兽的数据和怪兽的功能(技能)绑定到一起
		只有怪兽可以调到怪兽的功能
		
	我们将数据与功能绑定到一起的操作起名为:'面向对象编程'
	本质:将特定的数据与特定的功能绑定到一起 将来只能彼此相互使用

四、编程思想

	面向过程编程
		截止之前 我们所编写的代码都是面向过程编程
		过程其实就是流程 面向过程编程其实就是在执行一系列的流程
		就是按照指定的步骤依次执行 最终就可以得到想要的结果
		
	面向对象编程
		核心就是'对象'二字
		对象其实就是一个容器 里面将数据和功能绑定到了一起
		eg: 游戏人物 ...
		只负责创造出该人物以及该人物具备的功能 至于后续战绩如何无人知晓

	面向过程编程相当于让你给出一个问题的具体解决方案
	面向对象编程相当于让你创造出一些事物之后不用你管
	
	上述两种编程思想没有优劣之分 仅仅是使用场景不同
	甚至很多时候是两者混合使用

五、对象与类的概念

	对象:数据与功能的结合体
	类:多个对象相同的数据和功能的结合体

	类比学习法
		一个人			对象
		多个人			人类
		
		一条狗			对象
		多条狗			犬类

	类主要用于记录多个对象相同的数据和功能
	对象则用于记录多个对象不同的数据和功能
	ps:在面向对象编程中 类仅仅是用于节省代码 对象才是核心

六、对象与类的创建

	创建类的完整语法
		class People:
		    # 学生对象公共的数据
		    # 学生对象公共的方法
		    
		1.class是定义类的关键字
		2.People是类的名字
			类名的命名跟变量名一致 并且推荐首字母大写(为了更好的区分)
		3.类体代码
			公共的数据\公共的方法
		ps:类体代码在类定义阶段就会执行!!!
	
		class Student:
			school = '清华大学'
			def choice_course(self):
				print('正在选课')
		
		查看名称空间的方法
		print(Student.__dict__)  			# 使用该方法查看名称空间 可以看成是一个字典
		print(Student.__dict__['school'])  	# 使用字典的取值方式获取名字
		print(Student.__dict__.get('choice_course'))  # 使用字典的取值方式获取名字
		'''在面向对象编程中 想要获取名称空间中的名字 可以采用句点符'''
		print(Student.school)				# 通过句点符获取名称空间中的名称
		print(Student.choice_course)		# 通过句点符获取名称空间中的名称
		'''类实例化产生对象>>>: 类名加括号'''
		stu1 = Student()					
		stu2 = Student()					
		print(stu1)  						# <__main__.Student object at 0x000001D923B04A60>
		print(stu2)  						# <__main__.Student object at 0x0000025E8A48F130>
		print(stu1.__dict__, stu2.__dict__) # {} {}
		print(stu1.school)					# 清华大学
		print(stu2.school)					# 清华大学
		print(stu1.choice_course)			# 拿到choice_course的函数名代码体
		print(stu2.choice_course)			# 拿到choice_course的函数名代码体
		Student.school = '北京大学'  		# 修改school键对应的值
		print(stu1.school)					# 北京大学
		print(stu2.school)					# 北京大学
		"""
		我们习惯将类或者对象句点符后面的东西称为属性名或者方法名

七、对象独有数据

		class Student:
			school = '清华大学'
			def choice_course(self):
				print('正在选课')

		1.直接利用__dict__方法朝字典添加键值对
			obj1 = Student()
			obj1.__dict__['name'] = 'LIKE'  # 等价于 obj1.name = 'LIKE'
			obj1.__dict__['gender'] = 'male'  # 等价于 obj1.name = 'male'
			print(obj1.name)
			print(obj1.gender)
			print(obj1.school)					# 清华大学
		
		2.将添加独有数据的代码封装成函数
			def init(obj,name,age,gender):
		    obj.__dict__['name'] = name
		    obj.__dict__['age'] = age
		    obj.__dict__['gender'] = gender
			stu1 = Student()
			stu2 = Student()
			init(stu1,'jason',18,'male')
			init(stu2, 'kevin',28,'female')
			'''这个时候stu1,stu2都有自己独立的数据了'''

		3.init函数是专用给学生对象创建独有的数据 其他对象不能调用
		  面向对象思想
		  将数据和功能整合到一起将函数封装到学生类中 这样只有学生类产生的对象才有资格访问
		
			class Student:
		    """
		    1.先产生一个空对象
		    2.自动调用类里面的__init__方法 将产生的空对象当成第一个参数传入
		    3.将产生的对象返回出去
		    """
		    def __init__(self, name, age, gender):
		        self.name = name  # obj.__dict__['name'] = name
		        self.age = age  # obj.__dict__['age'] = age
		        self.gender = gender  # obj.__dict__['gender'] = gender
		
		    school = '清华大学'
		
		    def choice_course(self):
		        print('正在选课')
		
			stu1 = Student('jason', 18, 'male')
			print(stu1.__dict__)
			stu2 = Student('kevin', 28, 'female')
			print(stu2.__dict__)

在这里插入图片描述

本文仅讲了Python中的面向对象的个人理解,技术小白记录学习过程,有错误或不解的地方请指出,如果这篇文章对你有所帮助请点赞收藏+关注 谢谢支持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LoisMay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值