面向对象中组合的用法

# 组合  一个类对象的属性值是另外一个类的对象

# 狗
class Dog:
    def __init__(self, name, aggr, hp, kind):
        self.name = name
        self.aggr = aggr
        self.hp = hp
        self.kind = kind

    def bite(self, persion):
        persion.hp += self.aggr

# 人
class Persion:
    def __init__(self, name, aggr, hp, sex):
        self.name = name
        self.aggr = aggr
        self.hp = hp
        self.sex = sex
        self.money = 0

    def attack(self, dog):
        dog.hp -= self.aggr

    def get_weapon(self, weapon):   # 获得装备
        if self.money >= weapon.price:
            self.money -= weapon.price
            # 对象没有这个属性值则会创建一个weapon属性值
            self.weapon = weapon    # 一个对象的属性值是另外一个类的对象   组合
            self.aggr += weapon.aggr
        else:
            print(‘金币不足,请获取足够金币‘)

# 武器
class Weapon:
    def __init__(self, name, aggr, njd, price):
        self.name = name
        self.aggr = aggr
        self.njd = njd
        self.price = price
    def hand18(self, persion):  # 武器技能
        if self.njd > 0:
            persion.hp -= self.aggr * 2
            self.njd -= 1

alex = Persion(‘alex‘, 0.5, 100, ‘不详‘)
jin = Dog(‘金老板‘, 100, 500, ‘不详‘)
w = Weapon(‘打狗棒‘, 100, 3, 998)

# alex充了1000金币
alex.money += 1000

# alex买了打狗棒
alex.get_weapon(w)
print(alex.weapon)
print(alex.aggr)

# alex攻击了jin
alex.attack(jin)
print(jin.hp)

# alex使用武器的技能攻击jin
alex.weapon.hand18(jin)
print(jin.hp)

# 上面的例子其实就默默的用到了组合
# 组合:一个对象的属性值是另外一个类的对象
    # alex.weapon 是 Weapon类的对象

# 组合练习(谈到组合,就不只是一个类去解决问题)
# 创建一个老师类
# 老师有生日
# 生日可以是一个类
class Birthday:
    def __init__(self, year, mon, day):
        self.year = year
        self.mon = mon
        self.day = day

class Teacher:
    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex
        self.birthday = Birthday(1993, 8, 1)    # 组合用法一个对象的属性值是另外一个类的对象

#
t = Teacher(‘why‘, 23, ‘boy‘)
print(t.birthday.year)

# 大作业,校园管理系统

原文地址:https://www.cnblogs.com/whylinux/p/9736706.html

时间: 2024-07-30 15:06:15

面向对象中组合的用法的相关文章

类命名空间与对象、实例的命名空间和下面向对象的组合用法

创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类有两种属性:静态属性和动态属性 静态属性就是直接在类中定义的变量 动态属性就是定义在类中的方法 其中类的数据属性是共享给所有对象的 而类的动态属性是绑定到所有对象的 创建一个对象/实例就会创建一个对象/实例的名称空间,存放对象/实例的名字,称为对象/实例的属性 在自己的名称空间里找,找不到就去类中找,类也找不到就去找父类...最后找不到就会抛出异常 面向对象的组合用法 软件重用的重要方式除了继承之外还有一种

[Perl系列—] 2. Perl 中的引用用法

Perl 中的引用,为什么要使用引用? 对于熟悉C语言的开发者来说, 指针这个概念一定不陌生. Perl 的引用就是指针,可以指向变量.数组.哈希表甚至子程序. Perl5中的两种Perl引用类型为硬Perl引用和符号Perl引用.符号Perl引用含有变量的名字,它对运行时创建变量名并定位很有用,基本上,符号Perl引用就象文件名或UNIX系统中的软链接.而硬Perl引用则象文件系统中的硬链接. Perl4只允许符号Perl引用,给使用造成一些困难.例如,只允许通过名字对包的符号名哈希表(名为_

PHP 面向对象中常见关键字使用(final、static、const和instanceof)

PHP 面向对象中常见关键字的使用: 00x1.Final :final关键字可以加在类或者类中方法之前,但是不能使用final标识成员属性. 作用: 使用final标识的类,不能被继承. 在类中使用final标识的成员方法,在子类中不能覆盖. 总结:final表示为最终的意思,所以使用final关键字的类或者类中的成员方法是不能被更改的. 00x2.Static :static关键字将类中的成员属性或者成员方法标识为静态的,static标识的成员属性属于整个类,static成员总是唯一存在的,

深入分析面向对象中的封装作用

之前我(梦在旅途)发表过一篇名为<深入分析面向对象中的对象概念>的文章,里面主要讲解了类与对象的关系以及对象的概念.状态.行为.角色几个知识点,让大家对对象有了一些深入的了解,而本文则再来谈谈面向对象的三大特性之一:封装,封装是实现面向对象的基础,深入的理解封装的特性,有利于我们能更好的领悟面向对象的思想以及实现面向对象编程.以下均为本人凭借多年开发经验总结的个人观点,大家若发现有误或不足的地方,欢迎指正和交流,谢谢! 一.什么是封装? 顾名思义,封:封闭,装:装起来,将具体的实现细节装到一个

Linux中 find 常见用法示例

Linux中find常见用法示例 #find path -option [ -print ] [ -exec -ok command ] {} \; #-print 将查找到的文件输出到标准输出 #-exec command {} \; —–将查到的文件执行command操作,{} 和 \;之间有空格.其实在命令执行的时候"{}"将被find到的结果替换掉,因此将"{}"看成find到的文件来进行操作就很容易理解这个选项了. #-ok 和-exec相同,只不过在操作

一个CSS中Z-index的用法

一个CSS中Z-index的用法 CSS教程:彻底掌握Z-index属性 大多数的CSS属性都很容易使用.常常,当您对标记语言的元素使用CSS属性时,产生的结果会随着您刷新页面而立即呈现.而另一些CSS属性,却会有一些复杂,且只能在给定的环境下才会工作. Z-index属性便属于上面所说的后面的那一组.Z-index无疑的比其他任何属性都会频繁的导致(兼容性)上 的混乱和(开发者心理上)的挫败感.但滑稽的是,一旦你真正理解了Z-index,你会发现它却是一个非常容易使用的属性,并且会为解决很多l

Hibernate中Criteria的用法

Hibernate中Criteria的用法 criteria英[kra??t??r??]美[kra??t?r??]标准 1,Criteria Hibernate 设计了 CriteriaSpecification 作为 Criteria 的父接口,下面提供了 Criteria和DetachedCriteria . 2,DetachedCriteria Spring 的框架提供了getHibernateTemplate ().findByCriteria(detachedCriteria) 方法可

(转)C++ STL中list的用法

博客搬家啦http://t.cn/RvFZs2c STL中list的用法 C++ Lists(链表) 赋值(assign) 语法: void assign( input_iterator start, input_iterator end ); void assign( size_type num, const TYPE &val ); assign()函数以迭代器start和end指示的范围为list赋值或者为list赋值num个以val为值的元素. 相关主题: insert(), back

(转)linux 中特殊符号用法详解

linux 中特殊符号用法详解 原文:https://www.cnblogs.com/lidabo/p/4323979.html # 井号 (comments)#管理员  $普通用户 脚本中 #!/bin/bash   #!/bin/sh井号也常出现在一行的开头,或者位于完整指令之后,这类情况表示符号后面的是注解文字,不会被执行. # This line is comments.echo "a = $a" # a = 0由于这个特性,当临时不想执行某行指令时,只需在该行开头加上 # 就