• python's ninteenth day for me 类的组合,继承。


    组合:

      表示一个类的对象作为另一个类对象的属性。

    实例化的过程:

      1,创建一个对象。

      2,__init__ 给对象添加一些属性,对象默认的名字为self。

      3,将self所指向的内存空间返回给实例化他的地方。

    使用这个对象可以找到两个东西:

      1,对象所在的内存中存储的属性。

      2,类对象指针所指的类中的所有方法和静态属性。

    对象找名字的时候:先找自己内存空间中的,再找类的。

    对象没有权利修改类中的静态变量和方法。

    用类名操作静态变量(属性)。

    类名:实例化对象,调用静态属性,执行方法。

    交互:对象可以作为参数传递给类中的方法。

    组合:对象可以作为一个对象的属性。

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

    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):
            dog.hp -= self.ad
            print('%s攻击了%s,%s掉了%s点血' % (self.name,dog.name,dog.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,person):
            person.hp -= self.ad
            print('%s咬了%s,%s掉了%s点血' % (self.name,person.name,person.name,self.ad))
    class Weapon:
        def __init__(self,name,price,ad,level):
            self.name = name
            self.price = price
            self.ad = ad * level
            self.level = 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','不详',1,5)
    boss_jin = Person('金老板','',20,50)
    teddy = Dog('笨笨','teddy',150,50)
    futou = Weapon('斧头',1000,100,1)
    
    # alex.weapon.skill()
    # print(alex.weapon)
    # print(futou)
    # futou.skill(teddy)
    lis = ['攻击','充值','装备武器','使用武器']
    while True:
        for index,value in enumerate(lis,1):
            print(index,value)
        choice = int(input('请输入你的选择:'))
        if choice == 1:
            alex.attack(teddy)
        elif choice == 2:
            alex.pay()
        elif choice == 3:
            alex.wear(futou)
        elif choice == 4:
            alex.weapon.skill(teddy)
        else:
            print('无效序号:')

    组合的实例:

    # 圆形类
    # 写一个圆环类 组合 圆形类 去完成 计算圆环的面积和周长
    # 一个类的对象作为另一个类对象的属性
    # 圆环中有圆
    
    # 圆形类 : 计算圆形面积 和 周长
    # 圆环类 :
        # 圆环的周长 : 大圆周长加小圆周长
        # 圆环的面积 :  大圆的面积 - 小圆的面积
    from math import pi
    class Circle:
        def __init__(self,r):
            self.r = r
        def cir_area(self):
            return pi*self.r**2
        def cir_perimeter(self):
            return pi*self.r*2
    
    class Ring:
        def __init__(self,max_r,min_r):
            self.max_r = Circle(max_r)    #  相当于实例化。self.max_r是Circle类中的一个对象。它又是Ring类中的对象的属性。
            self.min_r = Circle(min_r)
        def R_area(self):
            return self.max_r.cir_area() - self.min_r.cir_area()
        def R_perimeter(self):
            return self.max_r.cir_perimeter() + self.min_r.cir_perimeter()
    
    r1 = Ring(3,2)
    print(r1.R_area())
    print(r1.R_perimeter())

    班级和老师的关系(组合):

    # 老师
    # 姓名 年龄 性别 班级 : s11
    
    # 班级
    # 班级名 班级人数 科目 性质
    
    class Teacher:
        def __init__(self,name,age,sex,cla):
            self.name = name
            self.age = age
            self.sex = sex
            self.cla = cla
    
    class Cla:
        def __init__(self,name,num,course,type):
            self.name = name
            self.num = num
            self.course = course
            self.type = type
    cla = Cla('s11',99,'python','全栈')
    teacher = Teacher('Eva',18,'',cla)
    
    print(teacher.cla.name)
    print(teacher.cla.num)
    print(teacher.cla.course)
    print(teacher.cla.type)

    初识继承:

        单继承:

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

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

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

    class Parent:
        pass
    class Son(Parent):      # 继承关系
        pass
    print(Son.__bases__)  # 内置的属性
    print(Parent.__bases__)
    # (<class '__main__.Parent'>,)
    # (<class 'object'>,)

        多继承:

    class Parent1:
        pass
    class Parent2(Parent1):
        pass
    class Parent3:
        pass
    class Son(Parent2,Parent3):
        pass
    
    print(Parent1.__bases__)    # (<class 'object'>,)
    print(Parent2.__bases__)    # (<class '__main__.Parent1'>,)
    print(Parent3.__bases__)    # (<class 'object'>,)
    print(Son.__bases__)    # (<class '__main__.Parent2'>, <class '__main__.Parent3'>)

    父类:基类,超类。

    字类:派生类

    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))
    
    class Dog(Animal):
        def bite(self,person):
            print('%s咬了%s' % (self.name,person.name))
    
    alex = Person('a_sb',10,5)  # 继承了父类中的属性。
    dog = Dog('teddy',100,20)   # 继承了父类中的属性。
    
    
    # 继承中的派生方法。
    alex.attack(dog)
    dog.bite(alex)
    
    # 继承父类的方法,前提自己没有同名方法,否则无法继承。
    dog.eat()       # 继承了父类中的 方法。

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

    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

    面向对象的思想:

      1,不关心程序执行的过程。

      2,关心的是一个程序中的角色 以及 角色与角色之间的关系。

  • 相关阅读:
    Redis五种数据结构解析
    深入理解JAVA线程池
    数据看板superset在Windows环境下安装
    为什么要用docker
    非常完善的两个微服务框架比较(SpringCloud与Dubbo)
    Nginx配置之负载均衡、限流、缓存、黑名单和灰度发布
    jq
    22 道高频 JavaScript 手写面试题及答案
    input 限制 中文输入
    vue(js)点击目标div以外区域将目标div隐藏
  • 原文地址:https://www.cnblogs.com/stfei/p/8809290.html
Copyright © 2020-2023  润新知