Python学习基础笔记五十——对象组合

1、组合的概念:

软件重用的重要方式除了继承之外还有一个重要的方式:组合。

组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合。

例:人打狗的例:

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

    def bite(self, person):
        person.hp -= self.aggr


class Person:
    def __init__(self, name, aggr, hp, sex, weapon, money):
        self.name = name
        self.aggr = aggr
        self.hp = hp
        self.kind = sex
        self.weapon = None
        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
            self.weapon = weapon
            self.aggr += weapon.aggr


class Weapon:
    def __init__(self, name, aggr, njd, price):
        self.name = name
        self.aggr = aggr
        self.njd = njd
        self.price = price

    def hand18(self, person):
        if self.njd >= 1:
            person.hp -= self.aggr * 2   # 攻击力加2
            self.njd -= 1                # 耐久度减1


alex = Person('alex', 0.5, 100, '不详', None, 0)
jin = Dog('金老板', 100, 500, 'teddy')

# 实例了一个Weapon类对象
w = Weapon('打狗棒', 100, 3, 998)

# 给alex充值1000元
alex.money += 1000
print(alex.money)

# 给alex增加装备打狗棒
alex.get_weapon(w)
print(alex.weapon.name)
print(alex.aggr)

# alex 袭击金老板
alex.attack(jin)
print(jin.hp)

# alex 使用武器的降龙18掌的属性
alex.weapon.hand18(jin)
print(jin.hp)

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

alex.weapon是Weapon类的对象。

2、创建一个圆环类,并求它的周长和面积,通过组合实现。

from math import pi


class Circle():
    def __init__(self, radius):
        self.radius = radius

    def circumference(self):
        return pi * 2 * self.radius

    def area(self):
        return pi * pow(self.radius, 2)


class Ring:
    def __init__(self, outside_radius, inside_radius):
        self.outside_c = Circle(outside_radius)         # 通过外圆半径,创建一个outside_c圆对象
        self.inside_c = Circle(inside_radius)           # 通过内圆半径,创建一个inside_c圆对象

    def perimeter(self):
        return self.inside_c.circumference() + self.outside_c.circumference()

    def area(self):
        return self.outside_c.area() - self.inside_c.area()


# 实例化ring一个对象
ring = Ring(20, 10)

# 打印ring的面积
print(ring.area())

# 打印ring的周长
print(ring.perimeter())

这里有一个地方需要注意下:就是self不单单可以传入的参数的值,也可以依赖参数生成的新值。

这个圆环就是一个特殊的例子。

3、创建一个老师类、老师有生日、生日也是一个类。组合

class Birthday:
    def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day

    def get_year(self):
        return self.year

    def get_month(self):
        return self.month

    def get_day(self):
        return self.day


class Course:
    def __init__(self, course_name, period, price):
        self.course_name = course_name
        self.period = period
        self.price = price


class Teacher:
    def __init__(self, name, age, sex, birthday):
        self.name = name
        self.age = age
        self.sex = sex
        self.birthday = birthday
        self.course = Course('Python', '6 month', 20000)   # 在Teacher里面实例化了一个课程实例化course对象


birth = Birthday(1997, 12, 12)
t1 = Teacher('chang', 18, '男', birth)
print(t1.name)

# 获得老师是哪一年出生的
print(t1.birthday.get_year())

# 获得老师出生的月份
print(t1.birthday.month)

组合,可以解决我们编程80%的例子。

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

课后作业:学校管理系统

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值