zoukankan      html  css  js  c++  java
  • 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到底是谁的对象

  • 相关阅读:
    suse12安装详解
    Centos7上部署openstack mitaka配置详解(将疑难点都进行划分)
    菜鸟帮你跳过openstack配置过程中的坑[文末新添加福利]
    openstack中dashboard页面RuntimeError: Unable to create a new session key. It is likely that the cache is unavailable.
    Multiple network matches found for name 'selfservice', use an ID to be more specific.报错
    查看 SELinux状态及关闭SELinux
    SELinux深入理解
    IP地址、子网掩码、网络号、主机号、网络地址、主机地址
    Oracle job procedure 存储过程定时任务
    POI文件导出至EXCEL,并弹出下载框
  • 原文地址:https://www.cnblogs.com/a352735549/p/8808393.html
Copyright © 2011-2022 走看看