zoukankan      html  css  js  c++  java
  • 4-12日 面向对象的组合和继承

    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,dog):
            print('%s攻击了%s,%s掉了%s滴血'%(self.name,dog.name,dog.name,self.ad))
            dog.hp -= 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):
            if 'weapon'in alex.__dict__:
                alex.weapon.skill(teddy)
            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,person):
            print('%s咬了%s一口,%s掉了%s滴血'%(self.name,person.name,person.name,self.ad))
            person.hp -= 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,dog):
            dog.hp -= self.ad
            print('%s受到了%s的伤害,%s掉了%s滴血'%(dog.name,self.name,dog.name,self.ad))
    
    alex = Person('a_sb','male',45,40)
    boss_jin = Person('太把','male',60,50)
    teddy = Dog('小虎','teddy',300,60)
    fotou = Weapon('斧头',1000,100,1)
    
    lis = ['攻击','充值','装备武器','使用武器攻击']
    while True:
        for index,value in enumerate(lis,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(fotou)
            print('装备后余额%s'%alex.money)
        elif num == 4:
            alex.attack_with_weapon()
        else:
            print('无效的序号')
    View Code

    计算圆环面积和周长(用类的组合)

    from math import pi
    class Circle:
        def __init__(self,r):
            self.r = r
        def area(self):
            return pi *self.r **2
        def perimeter(self):
            return pi *self.r *2
    class Ring:
        def __init__(self,out_r,in_r):
            self.out_circle = Circle(out_r)
            self.in_circle = Circle(in_r)
        def area(self):
            return self.out_circle.area() - self.in_circle.area()
        def perimeter(self):
            return self.out_circle.perimeter() + self.in_circle.perimeter()
    
    ring1 = Ring(20,12)
    print(ring1.area())
    print(ring1.perimeter())
    View Code

    班级和老师之间的组合方法

    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('无敌11期',96,'python','脱产全栈')
    print(py11.course)
    
    boss_jin = Teacher('太白','male',33,py11)
    
    print(py11.course)
    print(boss_jin.cls.num)
    print(boss_jin.cls.name)
    print(boss_jin.cls.course)
    View Code

    2,继承

    继承:类和类之间的关系,是什么是什么的关系。

    继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类

    class Parent:pass
    class Son(Parent):pass
    print(Son.__bases__)

    Son就继承了Parent,可以用  __bases__ 查看。

    在python 3中所用的类都会默认继承object类,继承了object类的所有类都是新式类,如果一个类没有继承任何父类,那么__bases__的属性就会显示< class  object>

    继承有单继承和多继承、

    class Parent1:pass
    class Parent2:pass
    class Son(Parent1):pass
    class Son(Parent1,Parent2):pass
    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))
    
    alex = Person('alex',10,5)
    print(Person.__dict__)
    print(Person.role)
    print(alex.__dict__)
    dog =Dog('teddy',100,20)
    print(dog)
    print(dog.__dict__ )
    View Code

    对象使用名字的顺序,先找对象自己的内存空间中的,再找对象对象自己类中的,再找父类中的。

    继承父类的方法,自己没有同名的方法就继承父类的,有就用自己的。和使用名字的顺序一样。

    先抽象再继承。即抽取类似或者说比较像的部分。

  • 相关阅读:
    es5预览本地文件、es6练习代码演示案例
    Java实现 LeetCode 838 推多米诺(暴力模拟)
    Java实现 LeetCode 838 推多米诺(暴力模拟)
    Java实现 LeetCode 838 推多米诺(暴力模拟)
    Java实现 LeetCode 837 新21点(DP)
    Java实现 LeetCode 837 新21点(DP)
    Java实现 LeetCode 837 新21点(DP)
    Java实现 LeetCode 836 矩形重叠(暴力)
    Subversion under Linux [Reprint]
    Subversion how[Reprint]
  • 原文地址:https://www.cnblogs.com/yzxing/p/8810512.html
Copyright © 2011-2022 走看看