• Day19


    1、组合

    组合:一个类的对象作为另一个类对象的属性

    表示的一种什么有什么的关系

    #人狗大战
    class Person:
        def __init__(self,name,sex,hp,ad):
            self.name=name
            self.sex=sex
            self.hp=hp
            self.ad=ad
            self.money=0
        def attack(self,d):
            d.hp-=self.ad
            print('%s攻击了%s,%s掉了%s点血' %(self.name,d.name,d.name,self.ad))
        def pay(self):
            money=int(input('请输入你要充值的金额:'))
            self.money+=money
            print('您的余额是:%s' %self.money)
        def wear(self,weapon):
            if self.money>=weapon.price:
                self.weapon=weapon
                self.money-=weapon.price
                print('购买成功,您已经顺利装备了%s' %weapon.name)
            else:
                print('余额不足,请充值。')
        def attack_with_weapon(self,dog):
            if 'weapon' in self.__dict__:
                self.weapon.skill(dog)
            else:
                print('请先装备武器')
    class Dog:
        def __init__(self,name,kind,hp,ad):
            self.name = name
            self.kind = kind
            self.hp = hp
            self.ad = ad
        def bite(self,p):
            p.hp-=self.ad
            print('%s咬了%s一口,%s掉了%s点血' % (self.name, p.name, p.name, self.ad))
    class Weapon:
        def __init__(self,name,price,ad,level):
            self.name = name
            self.price = price
            self.level = level
            self.ad = ad * self.level
        def skill(self,d):
            dog.hp-=self.ad
            print('%s受到了%s的伤害,%s掉了%s点血'%(dog.name,self.name,dog.name,self.ad))
    alex = Person('a_sb','不详',1,5)
    boss_jin = Person('金老板','女',20,50)
    teddy = Dog('笨笨','teddy',150,50)
    futou = Weapon('斧头',1000,100,1)
    nife = Weapon('刀',1000,100,1)
    lst = ['攻击','充值','装备武器','使用武器攻击']
    while True:
        for index, value in enumerate(lst, 1):
            print(index, value)
        num = int(input('请选择操作序号 >>>'))
        if num == 1:
            alex.attack(teddy)
        elif num == 2:
            alex.pay()
        elif num == 3:
            print('装备前余额 %s'%alex.money)
            alex.wear(futou)
            print('装备后余额 %s' % alex.money)
        elif num == 4:
            alex.attack_with_weapon()
        else:
            print('无效的序号')

    为什么会用组合:独立的对象不能发挥它的作用,必须依赖一个对象

    # 圆形类
    # 写一个圆环类 组合 圆形类 去完成 计算圆环的面积和周长
    # 一个类的对象作为另一个类对象的属性
    # 圆环中有圆
    
    # 圆形类 : 计算圆形面积 和 周长
    # 圆环类 :
        # 圆环的周长 : 大圆周长加小圆周长
        # 圆环的面积 :  大圆的面积 - 小圆的面积
    from math import pi
    class Circle:   # 圆形的面积公式不会变
        def __init__(self,r):
            self.r = r
        def cal_area(self):
            return pi*self.r**2
        def cal_perimeter(self):
            return pi * self.r * 2
    
    
    class Ring2:  # 圆环
        def __init__(self,out_r,in_r):
            c1_obj = Circle(out_r)
            self.out_circle = c1_obj
            self.in_circle = Circle(in_r)
        def area(self):
            return self.out_circle.cal_area() - self.in_circle.cal_area()
        def cal_perimeter(self):
            return self.out_circle.cal_perimeter() + self.in_circle.cal_perimeter()
    r1 = Ring2(10,5)
    print(r1.area())
    print(r1.cal_perimeter())
    # 老师
    # 姓名 年龄 性别 班级 : s11
    
    # 班级
    # 班级名 班级人数 科目 性质
    
    class Clas:
        def __init__(self,name,num,course,type):
            self.name = name
            self.num = num
            self.course = course
            self.type = type
    
    class Teacher:
        def __init__(self,name,sex,age,py11):
            self.name = name
            self.sex = sex
            self.age = age
            self.cls = py11
    
    py11 = Clas('超级无敌s11',89,'python','脱产全栈')
    print(py11.course)
    
    boss_jin = Teacher('太白','',40,py11)
    print(py11.course)          # 11期的课程
    print(boss_jin.cls.course)  # 金老板所带的班级的课程
    print(boss_jin.cls.name)  # 金老板所带的班级的课程
    print(boss_jin.cls.num) 

    2、继承

    类与类之间的关系: 什么是什么的关系

    单继承

    class Parent:pass
    class Son(Parent):pass   # 继承关系
    # Son继承了Parent
    print(Son.__bases__)  # 内置的属性
    print(Parent.__bases__)  # 内置的属性

    在python3中,所有的类都会默认继承object类

    继承了object类的所有类都是新式类

    如果一个类没有继承任何父类,那么__bases__属性就会显示<class 'object'>

    多继承

    class Parent1:pass
    class Parent2(Parent1):pass
    class Parent3:pass
    class Son(Parent2,Parent3):pass   # 继承关系
    print(Parent2.__bases__)
    print(Son.__bases__)

    父类:基类,超类

    子类:派生类

    class Animal:
        role = 'Animal'
        def __init__(self,name,hp,ad):
            self.name = name     # 对象属性 属性
            self.hp = hp         #血量
            self.ad = ad         #攻击力
    
        def eat(self):
            print('%s吃药回血了'%self.name)
    
    class Person(Animal):
        r = 'Person'
        def attack(self,dog):   # 派生方法
            print("%s攻击了%s"%(self.name,dog.name))
    
        def eat2(self):
            print('执行了Person类的eat方法')
            self.money = 100
            self.money -= 10
            self.hp += 10
    
    class Dog(Animal):
        def bite(self,person):  # 派生方法
            print("%s咬了%s" % (self.name, person.name))

    阿斯顿先有了人 狗两个类发现

    两个类有相同的属性、方法

    人和狗 都是游戏里的角色

    抽象出一个animal类型

    继承

    继承中的init
    alex = Person('alex',10,5)
    print(Person.__dict__) # role
    print(Person.role)
    print(alex.__dict__)
    dog = Dog('teddy',100,20)
    print(dog)
    print(dog.__dict__)

    继承中的派生方法
    alex = Person('alex',10,5)
    dog = Dog('teddy',100,20)
    alex.attack(dog)
    dog.bite(alex)

    继承父类的方法:自己没有同名方法
    alex = Person('alex',10,5)
    dog = Dog('teddy',100,20)
    alex.eat2()
    alex.eat()
    dog.eat()

    对象使用名字的顺序: 先找对象自己内存空间中的,再找对象自己类中的,再找父类中的
    alex = Person('alex',10,5)
    alex.eat = 'aaa'
    print(alex.eat()) # 报错

    class Parent:
        def func(self):
            print('in parent func')
        def __init__(self):
            self.func()
    class Son(Parent):
        def func(self):
            print('in son func')
    s=Son()  #in son func

    self.名字的时候,不要看self当前在哪个类里,要看这个self到底是谁的对象

  • 相关阅读:
    分割回文串(力扣第131题)
    子集 II(力扣第91题)
    子集(力扣第78题)
    组合总和 III(力扣第216题)
    JavaWeb部分 (前序)
    JavaSE部分 (IO流下)
    JavaSE部分 (IO流上)
    JavaSE部分 (File类)
    Leetcode 08.04 幂集 回溯与位图
    Leetcode 1405 最长快乐字符串 穷举与贪心
  • 原文地址:https://www.cnblogs.com/a352735549/p/8808393.html
Copyright © 2020-2023  润新知