面向对象组合用法

  • 软件重用的重要方式除了继承之外还有另外一种方式,即:组合
  • 组合指的是,在一个类中以另一个类的对象作为数据属性,称为类的组合
class Arms:  # 定义武器类bullet = 7.62def hit(self,man):  # 装备功能pass
class Man:  # 定义一个男人role = 'person'def __init__(self,name,arms):self.name = name  # 人的名字self.arms = Arms()  # 给人添加一个武器
human = Man('exes','ak117')
human.arms.hit('exes')
# human组合了一个武器的对象,可以直接human.arms来使用组合类中的所有方法圆环是由两个圆组成的,圆环的面积是外面圆的面积减去内部圆的面积。圆环的周长是内部圆的周长加上外部圆的周长。

圆环是由两个圆组成的,圆环的面积是外面圆的面积减去内部圆的面积。圆环的周长是内部圆的周长加上外部圆的周长。

这个时候,我们就首先实现一个圆形类,计算一个圆的周长和面积。然后在"环形类"中组合圆形的实例作为自己的属性来用

from math import piclass Circle:'''定义了一个圆形类;提供计算面积(area)和周长(perimeter)的方法'''def __init__(self,radius):self.radius = radiusdef area(self):return pi * self.radius * self.radiusdef perimeter(self):return 2 * pi *self.radiuscircle =  Circle(10) #实例化一个圆
area1 = circle.area() #计算圆面积
per1 = circle.perimeter() #计算圆周长
print(area1,per1) #打印圆面积和周长class Ring:'''定义了一个圆环类提供圆环的面积和周长的方法'''def __init__(self,radius_outside,radius_inside):self.outsid_circle = Circle(radius_outside)self.inside_circle = Circle(radius_inside)def area(self):return self.outsid_circle.area() - self.inside_circle.area()def perimeter(self):return  self.outsid_circle.perimeter() + self.inside_circle.perimeter()ring = Ring(10,5) #实例化一个环形
print(ring.perimeter()) #计算环形的周长
print(ring.area()) #计算环形的面积

用组合的方式建立了类与组合的类之间的关系,它是一种‘有’的关系

当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好

小练习之人狗大战

class Person:  # 定义一个人类role = 'person'  # 人的角色属性都是人def __init__(self, name, aggressivity, life_value, money):self.name = name  # 每一个角色都有自己的昵称;self.aggressivity = aggressivity  # 每一个角色都有自己的攻击力;self.life_value = life_value  # 每一个角色都有自己的生命值;self.money = moneydef attack(self,dog):# 人可以攻击狗,这里的狗也是一个对象。# 人攻击狗,那么狗的生命值就会根据人的攻击力而下降dog.life_value -= self.aggressivity
class Dog:  # 定义一个狗类role = 'dog'  # 狗的角色属性都是狗def __init__(self, name, breed, aggressivity, life_value):self.name = name  # 每一只狗都有自己的昵称;self.breed = breed  # 每一只狗都有自己的品种;self.aggressivity = aggressivity  # 每一只狗都有自己的攻击力;self.life_value = life_value  # 每一只狗都有自己的生命值;def bite(self,people):# 狗可以咬人,这里的狗也是一个对象。# 狗咬人,那么人的生命值就会根据狗的攻击力而下降people.life_value -= self.aggressivity
class Weapon:def __init__(self,name, price, aggrev, life_value):self.name = nameself.price = priceself.aggrev = aggrevself.life_value = life_valuedef update(self, obj):  #obj就是要带这个装备的人obj.money -= self.price  # 用这个武器的人花钱买所以对应的钱要减少obj.aggressivity += self.aggrev  # 带上这个装备可以让人增加攻击obj.life_value += self.life_value  # 带上这个装备可以让人增加生命值def prick(self, obj):  # 这是该装备的主动技能,扎死对方obj.life_value -= 500  # 假设攻击力是500
lance = Weapon('长矛',200,6,100)
kummen= Person('kum',10,1000,600)  #创造了一个实实在在的人kummen
ha2 = Dog('二愣子','哈士奇',10,1000)  #创造了一只实实在在的狗ha2#kummen独自力战"二愣子"深感吃力,决定穷毕生积蓄买一把武器
if kummen.money > lance.price: #如果kummen的钱比装备的价格多,可以买一把长矛lance.update(kummen) #kummen花钱买了一个长矛防身,且自身属性得到了提高kummen.weapon = lance #kummen装备上了长矛print(kummen.money,kummen.life_value,kummen.aggressivity)print(ha2.life_value)
kummen.attack(ha2)   #kummen打了ha2一下
print(ha2.life_value)
kummen.weapon.prick(ha2) #发动武器技能
print(ha2.life_value) #ha2不敌狡猾的人类用武器取胜,血槽空了一半

清空对象里面所有的value值_Python 面向对象之组合用法相关推荐

  1. python人狗大战游戏_python面向对象-----gt;组合的题目 定一个人狗大战 并且用面向对象的组合知识 - - ITeye博客...

    定一个人狗大战  并且用面向对象的组合知识 class Person(object): def __init__(self, name, sex, hp, ad): self.name = name ...

  2. 可以获取python中输出函数帮助的是_Python帮助函数调试函数 用于获取对象的属性及属性值...

    Python帮助函数调试函数 用于获取对象的属性及属性值 刚接触Python,上篇 <Python入门>第一个Python Web程序--简单的Web服务器 中调试非常不方便,不知道对象详 ...

  3. python的函数的对象属性_Python帮助函数调试函数 用于获取对象的属性及属性值...

    Python帮助函数调试函数 用于获取对象的属性及属性值 刚接触Python,上篇 <Python入门>第一个Python Web程序--简单的Web服务器 中调试非常不方便,不知道对象详 ...

  4. python中关系运算符惰性求值_python对象属性惰性取值

    python面向对象进阶 在知乎上面看到这个如何让python对象属性具有惰性求值的能力,认真学习了一番,记录一下. __setattr__.__getattr__.__delattr__ class ...

  5. JS-循环清空对象 判断数据类型的5种常用方法

    应用场景:一个页面具有大量数据录入功能,在数据录入保存成功之后,需要刷新页面,即清空所有的数据.因为我把所有的字段定义到一个对象中,所以要清空这个对象,如果字段少,可以直接赋值清空,但是数据多的时候, ...

  6. es6删除对象的属性_JavaScript删除和清空对象属性

    本文介绍一下如何利用JavaScript删除对象中的属性. 这是非常基础简单的操作,可能刚接触JavaScript的朋友会产生一些误操作. 首先看一段代码实例:[JavaScript] 纯文本查看 复 ...

  7. 微信小程序js数组初始化_微信小程序开发之改变data中数组或对象的某一属性值...

    前言:在小程序的开发中,我们在view中便利data中数组或对象时,很多情况下需要在js中动态改变数组或者对象中某一香的属性值. 效果图: 我给大家总结了案例如下: wxml如下: {{item.we ...

  8. python试题for循环布尔值_Python自我修炼(升仙中....整数,布尔值,字符串,for循环)

    索引(下标) 索引就是下标,下标从0开始,取值时索引所选长度不可以超过其本身. s1 = "python学习" print(s1[0]) # 获取第0个索引所对应的的元素. pri ...

  9. html 表单内容怎么获取不到,jquery中formdate一直获取不到对象中的[0]的值 包括本身也是一个空的数据怎么办?...

    jquery中formdate一直获取不到对象中的[0]的值 包括本身也是一个空的数据怎么办? 再做一个前台的ajax方法 查网上用formdate方法上传.可是进了接口之后一直在控制台获取不到for ...

最新文章

  1. [Serializable]序列化一句话理解
  2. 《Fortran95程序设计》(彭国伦)
  3. 【Java 8 新特性】Java Comparator.nullsLast | 将空元素被认为大于非空元素
  4. 转:移动建站工具(一):分秒钟将Web网站移动化
  5. js模仿QQ头像资料卡显示与隐藏
  6. 软考一些可能有用的链接
  7. Static Asynchronous Component Misuse Detection for Android Applications
  8. DurIAN模型介绍
  9. [Java]使用ArrayList类来把54张扑克牌发给3位玩家各17张,剩下3张是底牌
  10. 可视化建站系统是什么?
  11. 惠普HP Smart Tank 516 打印机驱动
  12. mybatis入门学习(九) -DB环境切换、使用注解、事务提交、获取自增ID、多参数传参、鉴别器、内置参数、批量写入、Oracle字段无法插入 null 值
  13. [7]能不能说一说浏览器缓存
  14. C语言-volatile关键字
  15. Linux ps 命令使用介绍
  16. 福师大计算机考研专硕,福师大性价比最高的管理类专硕!录取分数低,上岸比较容易!...
  17. 四川农业大学计算机专业答辩,四川农业大学远程教育2016年下半年本科论文答辩安排及注意事项...
  18. 大侠是怎样练成的-周昆
  19. [HFCTF 2021 Final]easyflask
  20. 照片人像模糊怎么调?两分钟教会你

热门文章

  1. netcore之json序列化
  2. win10双网卡冗余的几种方法
  3. python3.3.2_Python代码2转3、3转2的方法
  4. python torchvision_pip install torchvision error:安装版本为0.4.1的torch后继续安装torchvision报错...
  5. java程序设计比赛心得体会_对Java程序设计的感想.doc
  6. windows bat脚本实现快速配置JDK 环境变量
  7. Open browser failed!! Please check if you have installed the browser correct
  8. win10安装Visual Studio Code(VSCode)
  9. C语言会场安排问题贪心算法,贪心算法解决会场安排问题多处最优服务次序问题(含源代码).doc...
  10. redis 中一个字段 修改map_Redis中bitmap的妙用