首页 > 其他分享 >面向对象前戏

面向对象前戏

时间:2023-05-07 21:13:47浏览次数:27  
标签:obj val person get dog 面向对象 attack

前言

面向对象对于初学者而言是一个非常抽象的东西,直接讲解晦涩难懂,浅尝辄止!

要想畅通无阻的开启它的学习之路,需要学者们先跟着Jason老师一起先来编写一个有趣的案例>>>:人狗大战

案例

步骤1:模拟事物

既然是人狗大战,那肯定得有人和狗啊,目前我们学会的能够比较精确的描述出人和狗的只能是python基本数据类型里面的字典了

# 一个字典表示一人或一狗
dog1 = {
     'name': '小黑',   
     'type': '田园犬',  
     'attack_val': 30,
     'life_val': 200
 }
person1 = {
     'name': '小龙',
     'type': '猛男',
     'attack_val': 10,
     'life_val': 1000
 }

步骤2:函数封装

程序中人和狗都可以无限创建,如果每次都写上述字典的话那么代码过于冗余,所以我可以封装出两个函数专门用于创建人和狗

def get_person(name, gender, age, t_type, attack_val, life_val):
  	 '''创建人的函数'''
     data_dict = {
         'name': name,
         'gender': gender,
         'age': age,
         'type': t_type,
         'attack_val': attack_val,
         'life_val': life_val
     }
     return data_dict 
def get_dog(name, t_type, attack_val, life_val):
  	 '''创建狗的函数'''
     data_dict = {
         'name': name,
         'type': t_type,
         'attack_val': attack_val,
         'life_val': life_val
     }
     return data_dict

人和狗的数据模拟问题解决了,接下来就应该干仗了,让两者都具备攻击的能力,截至目前位置我们已经养成了条件反射,谈到所谓的具备某项功能、某种能力其实都可以用函数来模拟

步骤3:攻击能力

def dog_attack(dog_obj, person_obj):
    """
    狗咬人功能
    :param dog_obj: 接收一条狗
    :param person_obj: 接收一个人
    """
    # 使用最简答的掉血逻辑  血量减去对方攻击力
    print('当前人的血量是:%s' % 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['life_val']))
    
def person_attack(person_obj, dog_obj):
    """
    人揍狗功能
    :param person_obj: 接收一个人
    :param dog_obj: 接收一条狗
    """
    print('当前狗的血量是:%s'%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['life_val']))

步骤4:皇城PK

人和狗的数据有了,各自攻击的功能也有了,接下来就可以一较高下了

p1 = get_person('jason', 'male', 18, '猛男', 800, 1000)
p2 = get_person('kevin', 'female', 28, '淑女', 5, 100)
dog1 = get_dog('小黑', '松狮犬', 300, 500)
dog2 = get_dog('小白', '泰迪犬', 50, 200)
# 狗咬人
dog_attack(dog2,p1)
print(p1)
# 人揍狗
person_attack(p2, dog1)
print(dog1)

步骤5:黑白颠倒

我们模拟的数据与功能彼此是独立的,也就意味着攻击的函数双方可以随意调用

'''人调用了狗的攻击动作'''
dog_attack(p1, dog1)
'''狗调用了人的攻击工作'''
person_attack(dog2,p2)

步骤6:数据与功能绑定

我们想让人和狗各自只能调用各自攻击的功能>>>:函数嵌套

def get_person(name, gender, age, t_type, attack_val, life_val):
    # 将人的攻击动作放在产生人的函数内
    def person_attack(person_obj, dog_obj):
        print('当前狗的血量是:%s' % 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['life_val']))
        
    data_dict = {
        'name': name,
        'gender': gender,
        'age': age,
        't_type': t_type,
        'attack_val': attack_val,
        'life_val': life_val,
        'person_attack':person_attack
    }
    return data_dict
  
def get_dog(name, t_type, attack_val, life_val):
  	# 将狗的攻击动作放在产生狗的函数内
    def dog_attack(dog_obj, person_obj):
        print('当前人的血量是:%s' % 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['life_val']))
        
    data_dict = {
        'name': name,
        't_type': t_type,
        'attack_val': attack_val,
        'life_val': life_val,
        'dog_attack':dog_attack
    }
    return data_dict
  
p1 = get_person('jason','male',18,'猛男',800, 1000)
p2 = get_person('kevin','female',28,'淑女',10,100)
dog1 = get_dog('小黑', '松狮犬', 300, 500)
dog2 = get_dog('小白', '泰迪犬', 50, 200)
p1['person_attack'](p1,dog1)
dog1['dog_attack'](dog1,p2)

总结:思想升华

上述操作其实就是将数据与功能进行绑定,不再是所有的数据都可以调用任意的功能,而这一操作其实就是面向对象的编程思想

编程思想

我们平时听到的面向对象本质其实是一种编程思想大致可以分为两种

  • 面向过程编程
  • 面向对象编程

编程思想之面向过程编程

将程序的执行流程化 即分步操作 分步的过程中解决问题

# eg:注册、登录、结算购物车...
	"""注册:第一步获取用户名 第二步比对用户名数据 ..."""
	"""结算:第一步获取购物车数据 第二步计算钱数   ..."""

ps:过程可以理解成是流水线 面向过程编程可以理解成是在创建一条流水线

编程思想之面向对象编程

核心就是'对象'二字 ,对象其实就是一个"容器" 将数据与功能整合到一起,只要是符合上述描述的事物都可以称之为是对象!!!

# eg:
	"""人狗大战中对数据和功能的整合   可以称之为面向对象编程"""
        """模块文件内含有数据和功能函数   可以称之为面向对象编程"""
  ...

仔细的想想会发现python中一切皆对象>>>:都是数据和功能的整合

# eg:
	'''数据类型:含有数据和对应的内置方法(函数)'''
  '''文件对象:含有数据和对应的内置方法(函数)'''
  ...

标签:obj,val,person,get,dog,面向对象,attack
From: https://www.cnblogs.com/ycmyay/p/17380146.html

相关文章

  • 面向对象编程
    对象的概念”面向对象“的核心是“对象”二字,而对象的精髓在于“整合“,什么意思?所有的程序都是由”数据”与“功能“组成,因而编写程序的本质就是定义出一系列的数据,然后定义出一系列的功能来对数据进行操作。在学习”对象“之前,程序中的数据与功能是分离开的,如下#数据:name、ag......
  • C++虚函数详解:多态性实现原理及其在面向对象编程中的应用
    在面向对象的编程中,多态性是一个非常重要的概念。多态性意味着在不同的上下文中使用同一对象时,可以产生不同的行为。C++是一种面向对象的编程语言,在C++中,虚函数是实现多态性的关键什么是虚函数虚函数是一个在基类中声明的函数,它可以被子类重写并提供不同的实现。在C++中,使用关......
  • 字面量,Object新增api,面向过程和面向对象,类构造函数
    /*字面量速写:如果属性名和形参名一致,可以直接写形参名方法速写:省略冒号和functionsayHello(){}//实际上是sayHello:function(){}计算属性名通过[]计算出来*///方法速写//字面量速写://functionsan(a,b,c,d){//constsayHello=function(){//......
  • SIT232面向对象开发
    SIT232程序辅导、辅导Python/Java程序SIT232Object-OrientedDevelopmentTrimester1,20231PracticalTask4.1(PassTask)Submissiondeadline:Monday,April17Discussiondeadline:Saturday,May6GeneralInstructionsThispracticaltaskintroducesyoutoerrorhandl......
  • 01_java面向对象编程语言的思考
    java的跨平台在各个操作平台上,有一层JVM(java虚拟机),这是支撑java程序能够运行的基础。java源代码→(编译)→java字节码→(运行)→java虚拟机jdk:java开发工具包jre:java运行环境jvm:java虚拟机api:应用程序接口程序目录主要结构lib目录:存放Java的类库文件bin:java编译器,解释器工具......
  • 2023.5.5 面向对象程序设计实验报告
    实验项目名称:模板一、实验目的1、熟练掌握函数模板和类模板的定义格式。2、熟练运用函数模板和类模板解决实际问题。二、实验内容1、复数类Complex有两个数据成员:a和b,分别代表复数的实部和虚部,并有若干构造函数和一个重载-(减号,用于计算两个复数的距离)的成员函数。要求设计......
  • 面向对象高级知识
    new函数             hash函数   哈希去重原理   1.比价哈希值是否相同   2.比较内容是否相同   3.hash值是一串独一无二的数字字符   哈希的作用是为了比较元素,方便给容器中的元素通过比较hash值是否相同去重  ......
  • Java面向对象
     Java面向对象:封装,继承,多态(对像上转型),抽象每一个对象都有两个特征:属性(成员变量),行为(成员方法) 继承:被继承的类叫父类,反之为子类(关键字:extends)class子类extends父类  (注:Java语言只支持单重继承){……} 如果父类和子类中都定义了初始化器,则构造子类对象时,调用顺序为:......
  • java面向对象
    面向对象介绍学习获取已有的对象并使用学习如何自己设计对象并使用—>面向对象语法学习步骤:设计对象并使用封装this关键字构造方法标准JavaBean对象对象内存图补充知识:成员变量、局部变量区别设计对象并使用类和对象:类(设计图):是对象共同特征的描述对象:是真......
  • OOP面向对象第二个月学习总结
    OOP面向对象第二个月学习总结目录 · 前言 · 设计与分析 · 踩坑心得 · 改进建议 · 总结 一、前言这个月的学习相比上个月的学习,难度就提升了极多,为了让我们更好的理解面向对象的几个特点和原则,题目以及作业的难度,复杂度,综合性增加了许多。主要有几次实验,......