一、面向对象的组合用法

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

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

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

例子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. IDC:电源系统

    ylbtech-IDC:电源系统 电源系统(Power System)是由整流设备.直流配电设备.蓄电池组.直流变换器.机架电源设备等和相关的配电线路组成的总体.电源系统为各种电机提供各种高.低频交. ...

  2. Node.js做的代理转发服务器

    可以代理苹果ID服务器 const http = require('http'); const https = require('https'); const client = require('ht ...

  3. RHEL-server-7.0-Linux-centos安装过程

    虚拟机centos7的安装过程 win10 ()vmware软件的时候,1.先关闭防火墙(杀毒软件),在安装vmware虚拟机.2.试着全装一下 vmware-14版本. 1. 打开VMware Wo ...

  4. ELK 日志查询分析nginx日志

    # ======================== Elasticsearch Configuration ========================= # # NOTE: Elasticse ...

  5. 第2章 GNS3和PacketTracer网络模拟器(2)_搭建GNS3实验环境

    2. GNS3实验环境 2.1 教学实验1:配置路由器和VPCS (1)配置VPCS虚拟电脑的IP地址命令 //配置VPCS电脑的IP地址等信息 PC1> ? //查看可用的命令 PC1> ...

  6. Mysql的资源(安装版+解压版)

    Mysql的安装(安装版+解压版)! 首先有几个比较好的参考,mysql官网,菜鸟教程: (1)安装版 安装版资源,SQLyog-8.32(sn)(可视化工具), 安装过程基本和安装其它程序没有什么大 ...

  7. MySQL--局域网、外网访问MySQL

    一.局域网.外网访问 1. 打开CMD,导航到当前MySQL的bin路径,如下图: 2. 访问MySQL:输入MySQL -u root -p,点击Enter键,即可看到密码输入框: 输入密码,点需E ...

  8. Android数据传递,使用广播BroadcastReceiver;

    Android数据传递有很多种,Intent意图传递或使用Bundle去传递,接口监听回调传递数据,也可以把数据保存起来,使用的时候去读取等等等...,"当你知道足够多的数据传递的方式之后, ...

  9. form表单钩子,局部钩子和全局钩子

    form表单源码解析: 局部钩子: 全局钩子:

  10. 关于MySQL中pymysql安装的问题。

    一 一般情况下我们直接在终端输入: pip3 install pymysql 就能够自动安装成功. 但是有时候我们必须先指定一个python解释器: 比如我们指定python3 在终端cmd输入:py ...