软件测试|Python基础之面向对象(一)
  X7HGjGJ7MG9G 2023年11月02日 40 0

面向对象

面向对象(Object Oriented)是软件开发方法,一种编程范式。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。

面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。

这个定义比较抽象,我们通过举一个示例来说一下面向对象的思想。

人狗大战

  1. 需求
  • 用代码模拟人、狗打架的小游戏
  • 人和狗种类不同,因此双方的属性各不相同

思考一:

  • 人和狗各有不同属性
  • 使用字典方式储存属性较为方便,并可储存多种属性

根据上述思考,初步构思出来的代码如下

# 1、在字典内储存‘人’属性
person = {
'name': '阿拉蕾',
'age': 18,
'gender': '女',
'p_type': '战士',
'attack_val': 8000,
'life_val': 99999999
}

# 2、在字典内储存‘狗’特有属性
dog1 = {
'name': '小黑',
'd_type': '泰迪',
'attack_val': 100,
'life_val': 8000
}

思考二:

  • 按照上述方法,如果想要定义多个‘人’和‘狗’就需要反复设置多个字典,这样非常麻烦且费时
  • 这时可推导出,想要快速、便捷的定义多个‘人’和‘狗’,那么我们可以把字典内的数据封装在函数内,利用传参的方式,这样可以较为方便的生成多个‘人’和‘狗’,只需要使用不同变量名调用函数时传不同的参数即可

优化后的代码如下:

# 1、封装‘人’属性函数
def create_person(name, age, gender, p_type, attack_val, life_val):
person_dict = {
'name': name,
'age': age,
'gender': gender,
'p_type': p_type,
'attack_val': attack_val,
'life_val': life_val
}
return person_dict


# 2、封装‘狗’属性的函数
def create_dog(name, d_type, attack_val, life_val):
dog_dict = {
'name': name,
'd_type': d_type,
'attack_val': attack_val,
'life_val': life_val
}
return dog_dict


# 3、生成多个‘人’和‘狗’
p1 = create_person('阿拉蕾', 18, '男', '战士', 8000, 99999999)
p2 = create_person('小朵朵', 28, '女', '法师', 100, 800)

d1 = create_dog('小黑', '泰迪', 100, 8000)
d2 = create_dog('小白', '斗牛', 100, 800000)

思考三:

  • ‘人’和‘狗’就类似于各自不同种类的对象
  • 说到这里,我们就应该明白,‘人’和‘狗’因为种类不同,所以双方的属性也各不相同,也就是说不同的对象,属性(数据)各不相同
  • 当多个对象的属性生成后,我们就要开始定义彼此打架的动作(功能)
  • 人打狗的动作(脚踢)
  • 狗咬人的动作
# 1、人打狗的动作
def person_attack(person_dict, dog_dict):
print(f"{person_dict.get('name')}踢向{dog_dict.get('name')}")
dog_dict['life_val'] -= person_dict.get('attack_val')
print(f"人踢了狗一脚 狗掉血:{person_dict.get('attack_val')} 狗剩余血量:{dog_dict.get('life_val')}")

# 2、狗打人的动作
def dog_attack(dog_dict, person_dict):
print(f"{dog_dict.get('name')}向{person_dict.get('name')}咬去")
person_dict['life_val'] -= dog_dict.get('attack_val')
print(f"狗咬了人一口 人掉血:{dog_dict.get('attack_val')} 人剩余血量:{person_dict.get('life_val')}")

# 3、调用双方各自的函数,即可模拟出双方打架的动作
person_attack(p1, d1) # 人打狗
dog_attack(d2, p2) # 狗咬人
-------------------------------------------------------
阿拉蕾踢向小黑
人踢了狗一脚 狗掉血:8000 狗剩余血量:0
小白向小朵朵咬去
狗咬了人一口 人掉血:100 人剩余血量:700
  1. 核心思路
  • ‘人’和‘狗’就是不同的对象
  • 通过将不同的属性封装在不同的函数内,就可以通过相同的函数快速生成不同属性的对象
  • ‘人’和‘狗’打架的方式就是对象的功能
  • 人的打架方式是踢,狗的打架方式是咬,也就是说不同的类有着不同的功能,而相同的类就可以有着彼此相同的功能

需求:

  • 以上我们完成了不同种类的打架方式,但是在python中,如果没有特别的限制,我们就可以把人攻击的数据传在狗攻击函数内,这样就会产生混乱,要如何实现下列需求
  • ‘人’只能调用人的攻击方式
  • ‘狗’只能调用狗的攻击方式

优化一:

"""推导步骤4:如何实现只有人只能调用的人的攻击动作  狗只能调用狗的攻击动作>>>:数据与功能的绑定"""
def get_person(name, age, gender, p_type, attack_val, life_val):
# 产生人的函数(功能)
def person_attack(person_dict, dog_dict):
print(f"{person_dict.get('name')}踢向{dog_dict.get('name')}")
dog_dict['life_val'] -= person_dict.get('attack_val')
print(f"人踢了狗一脚 狗掉血:{person_dict.get('attack_val')} 狗剩余血量:{dog_dict.get('life_val')}")
# 表示人的信息(数据)
person_dict = {
'name': name,
'age': age,
'gender': gender,
'p_type': p_type,
'attack_val': attack_val,
'life_val': life_val,
'person_attack': person_attack
}
return person_dict


def get_dog(name, d_type, attack_val, life_val):
def dog_attack(dog_dict, person_dict):
print(f"{dog_dict.get('name')}向{person_dict.get('name')}咬去")
person_dict['life_val'] -= dog_dict.get('attack_val')
print(f"狗咬了人一口 人掉血:{dog_dict.get('attack_val')} 人剩余血量:{person_dict.get('life_val')}")
dog_dict = {
'name': name,
'd_type': d_type,
'attack_val': attack_val,
'life_val': life_val,
'dog_attack': dog_attack
}
return dog_dict


person1 = get_person('jason', 18, 'male', '猛男', 8000, 99999999)
dog1 = get_dog('小黑', '恶霸', 800, 900000)
person1.get('person_attack')(person1, dog1)

结论:

  • 通过上列代码,我们将人的专属攻击方式,封装在了人的类别内,实现了人专属的属性和功能,当人在调用自身类别,并传入符合条件的参数时,就可以生成一个人(对象)特有的属性(数据)和攻击方式(功能)
  • 同上,我们也可将狗的数据和攻击方式封装在狗特有的函数内,当我们生成多条狗的时候,每条狗也就有了,狗(对象)特有的属性(数据)和攻击方式(功能)

人狗大战推导就是面对对象的核心思想:数据与功能的绑定


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  SBowDWXjb0NT   2023年11月30日   40   0   0 redis线程池数据
X7HGjGJ7MG9G
最新推荐 更多