zoukankan      html  css  js  c++  java
  • day21-类的组合

    一、面向对象的组合用法

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

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

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

    例子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
  • 相关阅读:
    Mitmproxy使用教程for mac
    Flink重启策略
    Flink中的Time
    Flink的分布式缓存
    8-Flink中的窗口
    10-Flink集群的高可用(搭建篇补充)
    Flink-Kafka-Connector Flink结合Kafka实战
    15-Flink实战项目之实时热销排行
    16-Flink-Redis-Sink
    17-Flink消费Kafka写入Mysql
  • 原文地址:https://www.cnblogs.com/dxnui119/p/9968635.html
Copyright © 2011-2022 走看看