文章目录

  • 面向对象前夕(人狗大战)
  • 编程思想
  • 对象与类的概念
  • 对象与类的创建
  • 对象的独立数据

面向对象前夕(人狗大战)

步骤一:先创建出一个个人和狗

我们选择用字典的数据类型来创建,因为当我们使用字符串和列表的类型的时候,取值不方便

person1 = {  # 使用字典模拟人'name': 'jason','p_type': '猛男','attack_val': 800,'life_val': 2000
}
person2 = {  # 使用字典模拟人'name': '慢男','p_type': '闷骚','attack_val': 100,'life_val': 1200
}
dog1 = {  # 使用字典模拟狗'name': '小黑狗','d_type': '泰迪','attack_val': 50,'life_val': 800
}
dog2 = {  # 使用字典模拟狗'name': '小舔狗','d_type': '比特','attack_val': 800,'life_val': 8000
}

步骤二:因为当我们想创建很多个人或者狗的时候,我们需要写很多次,这样很麻烦,所以我们可以将其封装成函数

创建人的函数
def get_person(name, gender, age, p_type, attack_val, life_val):"""专用用于产生用户字典(创造人):param name: 姓名:param gender: 性别:param age: 年龄:param d_type: 类型:param attack_val:攻击力:param life_val: 生命值:return: 人的字典(人)"""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, p_type, attack_val, life_val):"""专用用于产生用户字典(创造人):param name: 姓名:param gender: 性别:param age: 年龄:param d_type: 类型:param attack_val:攻击力:param life_val: 生命值:return: 人的字典(人)"""dog_obj = {'name': name,'p_type': p_type,'attack_val': attack_val,'life_val': life_val}return dog_objp1 = get_person('jason', 'male', 18, '猛男', 8000, 90000)  # 创建出一个人
d1 = get_dog('小黄狗','中华田园犬',800, 5000)  # 创建出一条狗

步骤三:让人和狗具备攻击的能力,就是定义出对应的攻击函数

def person_attack(person_obj, dog_obj):"""专用提供给人调用 攻击狗:param person_obj: 传人数据(字典):param 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):"""专用提供给狗调用 攻击人:param dog_obj: 传狗数据(字典):param 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('jason', 'male', 18, '猛男', 8000, 90000)
p2 = get_person('kevin', 'female', 28, '淑女', 10, 200)
d1 = get_dog('小黄狗', '恶霸犬', 800, 8000)
d2 = get_dog('小黑狗', '巴哥犬', 200, 500)
# 调用攻击彼此的函数
person_attack(d1, p1)
# dog_attack(d2, p2)输出结果:
即将被攻击的狗:jason 当前血量:90000
人:小黄狗 锤了 狗:jason 狗掉血:800 剩余血量:89200

我们可以发现人和狗乱套了,人可以调用狗攻击的功能,狗可以调用人攻击的功能

解决方法:

步骤五:人跟人攻击狗的函数绑定 狗跟狗攻击人的函数绑定,我们定义的函数默认情况下都是可以被任意调用的,但是现在我们想实现定义的函数只有特定的东西才可以调用

def get_person(name, gender, age, p_type, attack_val, life_val):"""专用用于产生用户字典(创造人):param name: 姓名:param gender: 性别:param age: 年龄:param d_type: 类型:param attack_val:攻击力:param life_val: 生命值:return: 人的字典(人)"""def person_attack(person_obj, dog_obj):"""专用提供给人调用 攻击狗:param person_obj: 传人数据(字典):param 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_objdef get_dog(name, d_type, attack_val, life_val):"""专门用于产生狗字典(狗):param name: 狗的名字:param d_type: 狗的类型:param attack_val: 狗的攻击力:param life_val: 狗的生命值:return: 狗的字典(狗)"""def dog_attack(dog_obj, person_obj):"""专用提供给狗调用 攻击人:param dog_obj: 传狗数据(字典):param 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
d1 = get_dog('小黄狗', '恶霸犬', 800, 8000)
p1 = get_person('jason', 'male', 18, '猛男', 8000, 90000)
p1.get('person_attack')(p1, d1)这个时候,就只有人才能使用人攻击的能力,狗才能使用狗攻击的能力;这个时候就不会出现任意调用的情况

总结

将人的数据跟人的功能绑定到一起

只有人可以调用人的功能

将狗的数据跟狗的功能绑定到一起

只有狗可以调用狗的功能

我们将数据与功能绑定到一起的操作起名为:面向对象编程
本质:将特定的数据与特定的功能绑定到一起 将来只能彼此相互使用

编程思想

  • 什么是面向对象编程?

    面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。

  • 什么叫对象?

    核心就是对象二字

    对象其实就是一个容器 里面将数据和功能绑定到了一起

  • 面向过程的程序设计与面向对象的程序设计区别

    面向过程的程序设计:把计算机程序视为一系列的命令集合,即将一系列函数按照一定的顺序执行。为了使程序在设计方面达到简单的程度,面向过程会把一个较为复杂的函数继续分成一个个小功能函数,即把复杂的函数分成许多简单的函数并将它们进行组合。

    面向对象的程序设计:把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的数据信息,并处理这些信息,计算机程序的执行就是一系列信息在各个对象之间传递。

对象与类的概念

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

面向对象最重要的概念就是类(Class)和对象(Instance),必须牢记类是一种抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。

类比学习法

一个人 对象
多个人 人类

一条狗 对象
多条狗 狗类

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

对象与类的创建

在Python中,类的关键字是class

class Student:pass

在编程世界中必须要先有类才能产生对象

创建类的完整语法

class People:# 学生对象公共的数据# 学生对象公共的方法1.class是定义类的关键字
2.People是类的名字类名的命名跟变量名一致 并且推荐首字母大写(为了更好的区分)
3.类体代码公共的数据\公共的方法
ps:类体代码在类定义阶段就会执行!!!

eg:

class Student:# 学生对象公共的数据school = '清华大学'# 学生对象公共的方法def choice_course(self):print('正在选课')# 查看名称空间的方法
print(Student.__dict__)  # 使用该方法查看名称空间 可以看成是一个字典
print(Student.__dict__['school'])  # 使用字典的取值方式获取名字
print(Student.__dict__.get('choice_course'))  # 使用字典的取值方式获取名字输出结果:
{'__module__': '__main__', 'school': '清华大学', 'choice_course': <function Student.choice_course at 0x000001DC3339CBF8>, '__dict__': <attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of 'Student' objects>, '__doc__': None}
清华大学
<function Student.choice_course at 0x000001DC3339CBF8>
class Student:# 学生对象公共的数据school = '清华大学'# 学生对象公共的方法def choice_course(self):print('正在选课')Student.__dict__['school'] = '北京大学'
print(Student.school)  # 报错,不支持这样改Student.school = '北京大学'
print(Student.school)  # 北京大学
stu1 = Student()
print(stu1.__dict__)   # {}  空字典

在面向对象编程中 想要获取名称空间中的名字 可以采用句点符

object是Python里所有类的最顶级父类
类名的命名规则按照"大驼峰命名法"

对象的独立数据

将添加独有数据的代码封装成函数

class Student:def init(self, name, age, gender):self.name = name  # obj.__dict__['name'] = nameself.age = age  # obj.__dict__['age'] = ageself.gender = gender  # obj.__dict__['gender'] = gender# 左右两边的名字虽然一样 但是意思不一样 左边的其实是字典的键 右边的其实是实参stu1 = Student()
print(stu1.__dict__)  # {}
Student.init(stu1, 'jason', 18, 'male')
print(stu1.__dict__)  # {'name': 'jason', 'age': 18, 'gender': 'male'}
print(stu1.name)  # jason

这样代码还是不够精简,于是python为我们准备了一个方法

class Student:# 学生对象公共的数据school = '清华大学'# 学生对象公共的方法def choice_course(self):print('正在选课')def __init__(self, name, age, gender):self.name = name  # obj.__dict__['name'] = nameself.age = age  # obj.__dict__['age'] = ageself.gender = gender  # obj.__dict__['gender'] = gender# 左右两边的名字虽然一样 但是意思不一样 左边的其实是字典的键 右边的其实是实参stu1 = Student('jason', 18, 'male')
print(stu1.__dict__)
stu2 = Student('kevin', 28, 'female')
print(stu2.__dict__)
print(stu2.school)
stu2.choice_course()"""
1.先产生一个空对象
2.自动调用类里面的__init__方法 将产生的空对象当成第一个参数传入
3.将产生的对象返回出去
"""

__ init__ 方法的主要作用,就是初始化你的属性,这些属性,在上帝初始化你的时候就要赋予给你。
比如zhangsan = Person(170,29,50)这时上帝就把你创造出来了,也就是实例化了你。

init函数是专用给学生对象创建独有的数据 其他对象不能调用>>>:面向对象思想 将数据和功能整合到一起,将函数封装到学生类中 这样只有学生类产生的对象才有资格访问。

Day31——面向对象编程思想,类与对象相关推荐

  1. 八、Java面向对象编程(类、对象、方法、重载、可变参数、作用域、构造器、this本质)

    文章目录 Java面向对象编程(类.对象.方法.重载.可变参数.作用域.构造器.this本质) 一.类与对象 1. 类与对象的引出 2. 使用现有技术解决 3. 现有技术解决的缺点分析 4. 类与对象 ...

  2. python进阶《面向对象编程》类和对象

    目录 零.前言 一.面向对象编程 (一)概念理解 二.类和对象的概念 (一)面向对象的两个重要概念类和对象. (二)类的解释   1.创建类   2.类属性(区别于下面的对象属性) (三)对象的解释 ...

  3. day16 初识面向对象编程(类与对象、构造函数与对象,类与类)

    目录 一.面向对象和面向过程的区别 二.类与对象的概念 三.构造函数和对象的关系 三.类与类的关系:组合 四.类与类的关系:依赖 一.面向对象和面向过程的区别 面向过程:强调过程步骤 面向对象:强调对 ...

  4. 【Python】Python语言学习:面向对象编程,类和对象,封装、继承和多态

    这一周Python语言学习,记录如下. 01 面向对象编OOP 1.1 为什么学习和应用OOP? 1 OOP适合更加复杂的需求分析和项目开发. 2 OOP具有更强大的封装能力. 3 OOP相比于面向过 ...

  5. ES6学习笔记(一):轻松搞懂面向对象编程、类和对象

    文章目录 面向过程编程P OP(Process oriented programming) 面向对象编程OOP(Object Oriented Programming) ES6中的类和对象 面向对象 ...

  6. 初学者python笔记(面向对象编程、类与对象)

    文章目录 面向对象设计 类与对象的概念 1.类与对象的本质 2.面向对象设计 到 面向对象编程 3.类实例化 4.例如一个学校类 面向对象编程 1.案例 2.面向对象语言和面向对象编程之间的关系 3. ...

  7. [转载] Python3基础:08_02_面向对象编程(OOP)——类和对象

    参考链接: Python中的面向对象编程OOP | 3(继承,对象示例,issubclass和super) 0.前言   这篇博文将讲述Python面向对象开发中的类与对象的概念,包括对类和对象的理解 ...

  8. Kotlin系列二:面向对象编程(类与对象)

    目录 一  类与对象 二 延迟初始化属性与变量 三 继承 四 构造函数 4.1 主构造函数 4.2 次构造函数. 五 接口 六 数据类与单例类 6.1 数据类 6.2 单例类 七 密封类 八 嵌套类与 ...

  9. 用《叩响C#之门》复习C#基础知识 第八章 面向对象编程:类和对象(二)

    1.以对象为成员 类的成员不光可以是int.double等基本类型的变量,也可以是其他类的对象.其实也就是说,类的成员可以是所有的值类型和引用类型的成员变量. 2.静态成员 1)静态变量:描述类的整体 ...

最新文章

  1. 《LeetCode力扣练习》剑指 Offer 24. 反转链表 Java
  2. 01背包【动态规划】
  3. SpringBoot开发案例之整合Dubbo提供者(二)
  4. [Java] 实现多线程的两种方法
  5. zookeeper单节点部署
  6. 关于mmdetection上手的几点说明
  7. python—装饰器
  8. html的表单标记格式,HTML表单标签
  9. 201612-2 工资计算
  10. Python Imaging Library: ImageQt Module(图像QT模块)
  11. Jexus 配置ssl
  12. PaddlePaddle入门实践——手写数字识别
  13. Test meeting 11.23
  14. Win10、win7、win8免费升级win11系统的方法
  15. 快速傅里叶变换-快速傅里叶变换
  16. STM32CUBEMX(2)--USART通过DMA方式接收不定长数据
  17. 16个css3动画按钮/纯代码
  18. java lombok 插件_关于java:ieda中的Lombok插件安装及测试
  19. pip 查看和配置源
  20. [计算机网络]四、交换机的工作原理与配置(数据链路层、以太网交换机、交换机的基本配置)

热门文章

  1. 趣学算法--斐波那契数列
  2. 最详细的python案例学习与实践(含详细教程)
  3. 精灵盛典玛雅服务器账号,精灵盛典小号倒大号积分方法
  4. Android最新敲诈者病毒分析及解锁
  5. Mybatis入门详解
  6. 机器学习-集成学习(ensemble learning)
  7. 凌华服务器装系统,凌华科技推出首款采用英特尔Core、Xeon和Celeron 6000处理器的COM Express模块...
  8. sqlalchemy查询,with_entities,label的使用
  9. 还在为画“类Word文档报表”而发愁吗?
  10. 动态创建nfs的pvc失败问题排查