一、面向对象的组合用法

软件重用的重要方式除了继承之外还有另外一种方式,即:组合
组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合

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

作用:让类的对象与另一个类的对象发生关联,从而可以互相访问

例子1:

class Game_Role:
def __init__(self, name, ad, hp):
self.name = name
self.ad = ad
self.hp = hp def fight(self, role1):
role1.hp -= self.ad
print('%s攻击%s,%s血量还剩%s' % (self.name, role1.name, role1.name, role1.hp)) def weapon(self, wea):
# 武器类的对象封装到人的对象中当做一个属性,就叫做组合.
self.wea = wea class Weapon:
def __init__(self, name, ad):
self.name = name
self.ad = ad def attack(self, role1, role2):
role2.hp = role2.hp - self.ad - role1.ad
print('%s利用%s攻击%s,%s血量还剩%s' % (role1.name, self.name, role2.name, role2.name, role2.hp)) p1 = Game_Role('盖伦', 50, 500)
p2 = Game_Role('狗头', 80, 250)
sword = Weapon('大宝剑', 40)
p1.weapon(sword)
p1.wea.attack(p1, p2)
#盖伦利用大宝剑攻击狗头,狗头血量还剩160

例子2:

圆环是由两个圆组成的,圆环的面积是外面圆的面积减去内部圆的面积。圆环的周长是内部圆的周长加上外部圆的周长。
这个时候,我们就首先实现一个圆形类,计算一个圆的周长和面积。然后在"环形类"中组合圆形的实例作为自己的属性来用

from math import pi

class Circle:
'''
定义了一个圆形类;
提供计算面积(area)和周长(perimeter)的方法
'''
def __init__(self,radius):
self.radius = radius def area(self):
return pi * self.radius * self.radius def perimeter(self):
return 2 * pi *self.radius circle = 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()) #计算环形的面积

例子3:

定义生日类,课程类和人类,人可以与生日类和课程类组合,将生日类和课程类作为人类的参数

class Birthday:
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day class Course:
def __init__(self, name, period):
self.name = name
self.period = period class Person:
def __init__(self, name,birth, course):
self.name = name
self.birth = birth
self.course = course p1 = Person('Tom', Birthday(2000,5,10), Course('Python', '4 month'))
print(p1.name)
print(p1.birth.year, p1.birth.month, p1.birth.day)
print(p1.course.name, p1.course.period) 结果:
Tom
2000 5 10
Python 4 month

 或者Birthday类和Course类不变,修改Person类的代码如下:

class Person:
def __init__(self, name):
self.name = name
def my_birth(self,birth):
self.my_birth = birth
def my_course(self,course):
self.my_course = course bir1 = Birthday(2001,6,11)
course1 = Course('Java','5 month')
p1 = Person('Mike') p1.my_birth(bir1)
p1.my_course(course1)
print(p1.name, p1.my_birth.year, p1.my_birth.month, p1.my_birth.day)
print(p1.my_course.name, p1.my_course.period) 结果:
  Mike 2001 6 11
  Java 5 month

day21-类的组合的更多相关文章

  1. C++:类的组合

    在类中定义的数据成员一般都是基本数据类型或服复合数据类型.但是还可以根据需要使用 其他类的对象作为正在声明的数据成员.复杂的对象还可以有比较简单的对象一某种方式组合 而成,复杂对象和组成它的简单对象之 ...

  2. c++基础语法 构造函数 析构函数 类的组合

    1 构造函数 1.不能指定任何返回值,甚至连void都不能有. 2.与Java不同,c++不同new对象,对于无参的构造函数声明对象时括号应该省略. 2 析构函数 1. 前加~,不能有参数,不能有返回 ...

  3. c++,类的组合

    1. 在A类中以B类的对象作为成员变量,称为类的组合(composition). 可以先看看这篇文章理解组合的用处: C++中组合的使用 http://blog.csdn.net/jia_xiaoxi ...

  4. 【C++基础】类的组合

    所谓类的组合是指:类中的成员数据是还有一个类的对象或者是还有一个类的指针或引用.通过类的组合能够在已有的抽象的基础上实现更复杂的抽象. 比如: 1.按值组合 #include<iostream. ...

  5. C++类的组合例子

    Line类调用Point类的两个对象p1,p2作为其数据成员,计算线段长度 组合类构造函数定义的一般形式为: 类名::类名(形参表):内嵌对象1(形参表),内嵌对象2(形参表)... {类的初始化} ...

  6. python - class类 (三) 类的组合

    类的组合: #组合 class A1(): def pr(self): return 'a1' class A2(): def pr(self): return 'a2' class A3(): de ...

  7. python类的组合

    类的组合,即在类实例化时,将另一个类的实例作为参数传入,这样可以将两个实例关联起来. 当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好. 例如,描述一个机器人类,这个大类是由很多 ...

  8. day25类的组合多态封装

    类的组合多态与封装类的组合 1. 什么是组合  组合指的是某一个对象拥有一个属性,该属性的值是另外一个类的对象 2. 为何要用组合  通过为某一个对象添加属性(属性的值是另外一个类的对象)的方式,可以 ...

  9. Java编程的逻辑 (14) - 类的组合

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  10. 7 python 类的组合

    1.组合与重用性 软件重用的重要方式除了继承之外还有另外一种方式,即:组合 组合指的是,在一个类中以另外一个类的对象作为 1.一个类的属性可以是一个类对象,通常情况下在一个类里面很少定义一个对象就是它 ...

随机推荐

  1. springboot(二 如何访问静态资源和使用模板引擎,以及 全局异常捕获)

    在我们开发Web应用的时候,需要引用大量的js.css.图片等静态资源. 默认配置 Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则: /static / ...

  2. java1.8新特性(optional 使用)

    经常在程序中出现 java.lang.NullPointerException  为了避免  报错,总是要进行一些 是否为null 的if else 判断 ,1.8 可以使用optional 类 来简 ...

  3. flume-拦截器、channel选择器、sink组合sink处理器

    1. Flume Interceptors Flume有能力修改/删除流程中的events.这是在拦截器(interceptor)的帮助下完成的.拦截器(Interceptors)是实现org.apa ...

  4. Linux下统计局域网流量

    1:统计10.86.0.0/16网段的内网流量情况 将下面脚本保存成文件traffic-lan.sh(运行后需要等待10秒抓包) tcpdump -nqt src net and dst net ! ...

  5. [UE4]Cast to OverlaySlot、Set Vertical Alignment、Get Slot,解决Child Widget垂直居中对齐问题

  6. MCC MNC in china

    A mobile country code (MCC) is used in combination with a mobile network code (MNC) (a combination k ...

  7. centos7安装zookeeper3.4.12集群

    zookeeper的三要素: 1.一致,能够保证数据的一致性 2.有头,始终有一个leader,node/2+1个节点有效,就能正常工作 3.数据树,树状结构且每个树必须有数据 1. 环境准备 操作系 ...

  8. hive之权限问题AccessControlException Permission denied: user=root, access=WR

    问题描述:在集群上,用hive分析数据出现如下错误 FAILED: Execution Error, return code from org.apache.hadoop.hive.ql.exec.D ...

  9. 通过mapreduce把mysql的一张表的数据导到另外一张表中

    怎么安装hadoop集群我在这里就不多说了,我这里安装的是三节点的集群 先在主节点安装mysql 启动mysql 登录mysql 创建数据库,创建表格,先把数据加载到表格 t ,表格t2是空的 mys ...

  10. Java 1-Java 基础语法

    一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象:对象是类的一个实例,有状态和行为.例如,一条狗是一个对象,它的 ...