• python-study-21


    复习

    上节课复习
    
    
    
    今日内容:
        1、如何为对象定制独有的特征,__init__方法
        2、属性查找
        3、绑定方法
        总结
        4、面向对象三大特性之一:继承与派生
    
    
    '''
    面向过程编程:
        核心是过程二字,过程指的是解决问题的步骤,即想干什么再干什么后干什么。。。
        基于该思想编写程序就好比在设计一条流水线,是一种机械式的思维方式
    
        优点:
            复杂的问题流程化、进而简单化
        缺点:
            可扩展性差
    
    面向对象编程:
        核心是对象二字,对象是特征与技能的结合体
        基于该思想在编写程序就好比在创造一个世界,世界万物都是对象,你就是这个世界的上帝
    
    
        对象是特征与技能的结合体,类就是一系列对象相似的特征与技能的结合体
        站在不同的角度,总结出的类是截然不同的
    
        在现实世界中一定是先有的一个个具体存在的对象,然后随着人类文明地发展而总结出了不同的类
        在程序中务必保证先定义类,后调用类来产生对象
    
        现实世界中总结对象-----》抽取相似之处,得到现实世界中的类---》定义为程序中的类-----》调用类,产生程序中的对象
        站在老男孩选课系统的角度:
            现实世界中的老男孩学生对象:
                    对象1:
                        特征:
                            学校='oldboy'
                            姓名='耗哥'
                            年龄=18
                            性别='male'
                        技能:
                            选课
    
                    对象2:
                        特征:
                            学校='oldboy'
                            姓名='猪哥'
                            年龄=17
                            性别='male'
                        技能:
                            选课
    
                    对象3:
                        特征:
                            学校='oldboy'
                            姓名='帅翔'
                            年龄=19
                            性别='female'
                        技能:
                            选课
    
            站在老男孩选课系统的角度,先总结现实世界中的老男孩学生类
                    老男孩学生类:
                        相似的特征:
                            学校='oldboy'
                        相似的技能
                            选课
    
    
    '''
    #1、先定义类
    class OldboyStudent:
        school='oldboy'
    
        def choose_course(self):
            print('is choosing course')
    
    #强调:类定义阶段会立刻执行类体代码,会产生类的名称空间,将类体代码执行过程中产生的名字都丢进去
    # print(OldboyStudent.__dict__)
    # 类本质就是一个名称空间/容器,从类的名称空间中增/删/改/查名字
    # python为我们提供专门访问属性(名称空间中的名字)的语法,点后的都是属性
    # OldboyStudent.school #OldboyStudent.__dict__['school']
    # OldboyStudent.x=1 #OldboyStudent.__dict__['x']=1
    # OldboyStudent.school='Oldboy' #OldboyStudent.__dict__['school']='Oldboy'
    # del OldboyStudent.x #del OldboyStudent.__dict__['x']
    
    # 类中定义的函数是类的函数属性,类可以使用,但使用的就是一个普通的函数而已,意味着需要完全遵循函数的参数规则,该传几个值就传几个
    # OldboyStudent.choose_course(123)
    
    #2、后调用类产生对象,调用类的过程称之为实例化,实例化的结果称为类的一个实例或者对象
    stu1=OldboyStudent()
    stu2=OldboyStudent()
    stu3=OldboyStudent()
    # print(stu1)
    # print(stu2)
    # print(stu3)
    
    # print(OldboyStudent.school)
    # OldboyStudent.school='OLDBOY'
    # print(stu1.school)
    # print(stu2.school)
    # print(stu3.school)
    View Code

    为对象定制自己独有的属性

    '''
    # 例1
    class OldboyStudent:
        school='oldboy'
    
        def choose_course(self):
            print('is choosing course')
    
    stu1=OldboyStudent()
    stu2=OldboyStudent()
    stu3=OldboyStudent()
    
    #对象本质也就是一个名称空间而已,对象名称空间是用存放对象自己独有的名字/属性,而
    #类中存放的是对象们共有的属性
    # print(stu1.__dict__)
    # print(stu2.__dict__)
    # print(stu3.__dict__)
    
    stu1.name='耗哥'
    stu1.age=18
    stu1.sex='male'
    # print(stu1.name,stu1.age,stu1.sex)
    # print(stu1.__dict__)
    
    stu2.name='猪哥'
    stu2.age=17
    stu2.sex='male'
    
    stu3.name='帅翔'
    stu3.age=19
    stu3.sex='female'
    
    
    # 例2
    class OldboyStudent:
        school='oldboy'
    
        def choose_course(self):
            print('is choosing course')
    
    stu1=OldboyStudent()
    stu2=OldboyStudent()
    stu3=OldboyStudent()
    
    def init(obj,x,y,z):
        obj.name=x
        obj.age=y
        obj.sex=z
    
    # stu1.name='耗哥'
    # stu1.age=18
    # stu1.sex='male'
    init(stu1,'耗哥',18,'male')
    
    # stu2.name='猪哥'
    # stu2.age=17
    # stu2.sex='male'
    init(stu2,'诸哥',17,'male')
    
    # stu3.name='帅翔'
    # stu3.age=19
    # stu3.sex='female'
    init(stu3,'帅翔',19,'female')
    
    
    print(stu1.__dict__)
    print(stu2.__dict__)
    print(stu3.__dict__)
    '''
    
    
    class OldboyStudent:
        school='oldboy'
    
    
        def __init__(obj, x, y, z): #会在调用类时自动触发
            obj.name = x #stu1.name='耗哥'
            obj.age = y  #stu1.age=18
            obj.sex = z #stu1.sex='male'
    
        def choose_course(self):
            print('is choosing course')
    
    #调用类时发生两件事
    #1、创造一个空对象stu1
    #2、自动触发类中__init__功能的执行,将stu1以及调用类括号内的参数一同传入
    stu1=OldboyStudent('耗哥',18,'male') #OldboyStudent.__init__(stu1,'耗哥',18,'male')
    stu2=OldboyStudent('猪哥',17,'male')
    stu3=OldboyStudent('帅翔',19,'female')
    
    
    print(stu1.__dict__)
    print(stu2.__dict__)
    print(stu3.__dict__)
    View Code

    属性查找

    class OldboyStudent:
        school='oldboy'
        count=0
    
        def __init__(self, x, y, z): #会在调用类时自动触发
            self.name = x #stu1.name='耗哥'
            self.age = y  #stu1.age=18
            self.sex = z #stu1.sex='male'
            OldboyStudent.count+=1
    
        def choose_course(self):
            print('is choosing course')
    
    
    # 先从对象自己的名称空间找,没有则去类中找,如果类也没有则报错
    stu1=OldboyStudent('耗哥',18,'male')
    stu2=OldboyStudent('猪哥',17,'male')
    stu3=OldboyStudent('帅翔',19,'female')
    
    # print(OldboyStudent.count)
    print(stu1.count)
    print(stu2.count)
    print(stu3.count)
    View Code

    绑定方法

    class OldboyStudent:
        school='oldboy'
    
    
        def __init__(self, x, y, z): #会在调用类时自动触发
            self.name = x #stu1.name='耗哥'
            self.age = y  #stu1.age=18
            self.sex = z #stu1.sex='male'
    
        def choose_course(self,x):
            print('%s is choosing course' %self.name)
    
        def func():
            pass
    # 类名称空间中定义的数据属性和函数属性都是共享给所有对象用的
    # 对象名称空间中定义的只有数据属性,而且时对象所独有的数据属性
    
    stu1=OldboyStudent('耗哥',18,'male')
    stu2=OldboyStudent('猪哥',17,'male')
    stu3=OldboyStudent('帅翔',19,'female')
    
    # print(stu1.name)
    # print(stu1.school)
    
    
    # 类中定义的函数是类的函数属性,类可以使用,但使用的就是一个普通的函数而已,意味着需要完全遵循函数的参数规则,该传几个值就传几个
    # print(OldboyStudent.choose_course)
    # OldboyStudent.choose_course(123)
    
    # 类中定义的函数是共享给所有对象的,对象也可以使用,而且是绑定给对象用的,
    #绑定的效果:绑定给谁,就应该由谁来调用,谁来调用就会将谁当作第一个参数自动传入
    # print(id(stu1.choose_course))
    # print(id(stu2.choose_course))
    # print(id(stu3.choose_course))
    # print(id(OldboyStudent.choose_course))
    
    # print(id(stu1.school))
    # print(id(stu2.school))
    # print(id(stu3.school))
    #
    # print(id(stu1.name),id(stu2.name),id(stu3.name))
    
    
    # stu1.choose_course(1)
    # stu2.choose_course(2)
    # stu3.choose_course(3)
    # stu1.func()
    
    # 补充:类中定义的函数,类确实可以使用,但其实类定义的函数大多情况下都是绑定给对象用的,所以在类中定义的函数都应该自带一个参数self
    View Code

    类即类型

    #在python3中统一了类与类型的概念,类就是类型
    class OldboyStudent:
        school='oldboy'
    
        def __init__(self, x, y, z): #会在调用类时自动触发
            self.name = x #stu1.name='耗哥'
            self.age = y  #stu1.age=18
            self.sex = z #stu1.sex='male'
    
        def choose_course(self,x):
            print('%s is choosing course' %self.name)
    
    stu1=OldboyStudent('耗哥',18,'male')
    # stu1.choose_course(1) #OldboyStudent.choose_course(stu1,1)
    # OldboyStudent.choose_course(stu1,1)
    
    
    l=[1,2,3] #l=list([1,2,3])
    # print(type(l))
    # l.append(4) #list.append(l,4)
    list.append(l,4)
    print(l)
    View Code

    小结

    '''
    # 对象是一个高度整合的产物,整合数据与专门操作该数据的方法(绑定方法)
    class Foo:
        def __init__(self,host,port,db,chartset):
            self.host=host
            self.port=port
            self.db=db
            self.charset=charset
    
        def exc1(self,sql):
            conn = connect(self.host, self.port, self.db, self.charset)
            conn.execute(sql)
            return xxx
    
        def exc2(self,proc_name)
            conn = connect(self.host, self.port, self.db, self.charsett)
            conn.call_proc(sql)
            return xxx
    
    class Bar:
        def __init__(self,x,y,z,a,b,c):
            self.x=x
            self.y=y
            self.z=z
            self.a=a
            self.b=b
            self.c=c
    
        def exc3(self,xxx):
            pass
    
        def exc4(self,yyy)
            pass
    
    obj1=Foo('1.1.1.1',3306,'db1','utf-8')
    obj1.exc1('select * from t1')
    obj1.exc1('select * from t2')
    obj1.exc1('select * from t3')
    obj1.exc1('select * from t4')
    
    obj2=Foo('1.1.1.2',3306,'db1','utf-8')
    obj2.exc1('select * from t4')
    
    '''
    View Code

    继承与派生

    '''
    1、什么是继承
        继承是一种新建类的方式,新建的类称为子类,被继承的类称为父类
        继承的特性是:子类会遗传父类的属性
        强调:继承是类与类之间的关系
    
    2、为什么用继承
        继承的好处就是可以减少代码的冗余
    
    3、如何用继承
        在python中支持一个类同时继承多个父类
        在python3中
            如果一个类没有继承任何类,那默认继承object类
        在python2中:
            如果一个类没有继承任何类,不会继承object类
    
        新式类
            但凡继承了object的类以及该类的子类,都是新式类
        经典类
            没有继承object的类以及该类的子类,都是经典类
    
        在python3中都是新式类,只有在python2中才区别新式类与经典类
    
        新式类vs经典类?
    
    '''
    class Parent1(object):
        pass
    
    class Parent2(object):
        pass
    
    class Sub1(Parent1,Parent2):
        pass
    
    # print(Sub1.__bases__)
    print(Parent1.__bases__)
    print(Parent2.__bases__)
    View Code

    继承的应用

    #派生:子类中新定义的属性,子类在使用时始终以自己的为准
    class OldboyPeople:
        school = 'oldboy'
        def __init__(self,name,age,sex):
            self.name = name #tea1.name='egon'
            self.age = age #tea1.age=18
            self.sex = sex #tea1.sex='male'
    
    
    
    class OldboyStudent(OldboyPeople):
        def choose_course(self):
            print('%s is choosing course' %self.name)
    
    
    class OldboyTeacher(OldboyPeople):
        #            tea1,'egon',18,'male',10
        def __init__(self,name,age,sex,level):
            # self.name=name
            # self.age=age
            # self.sex=sex
            OldboyPeople.__init__(self,name,age,sex)
            self.level=level
    
        def score(self,stu_obj,num):
            print('%s is scoring' %self.name)
            stu_obj.score=num
    
    stu1=OldboyStudent('耗哥',18,'male')
    tea1=OldboyTeacher('egon',18,'male',10)
    
    #对象查找属性的顺序:对象自己-》对象的类-》父类-》父类。。。
    # print(stu1.school)
    # print(tea1.school)
    # print(stu1.__dict__)
    # print(tea1.__dict__)
    
    tea1.score(stu1,99)
    
    print(stu1.__dict__)
    
    
    # 在子类派生出的新功能中重用父类功能的方式有两种:
    #1、指名道姓访问某一个类的函数:该方式与继承无关
    
    # class Foo:
    #     def f1(self):
    #         print('Foo.f1')
    #
    #     def f2(self):
    #         print('Foo.f2')
    #         self.f1()
    #
    # class Bar(Foo):
    #     def f1(self):
    #         print('Bar.f1')
    #
    # #对象查找属性的顺序:对象自己-》对象的类-》父类-》父类。。。
    # obj=Bar()
    # obj.f2()
    # '''
    # Foo.f2
    # Bar.f1
    # '''
    View Code
     明日内容:1、继承剩余知识 2、封装 3、多态 
     
    面向对象作业
        1、类的属性和对象的属性有什么区别?
        2、面向过程编程与面向对象编程的区别与应用场景?
        3、类和对象在内存中是如何保存的。
        4、什么是绑定到对象的方法,、如何定义,如何调用,给谁用?有什么特性
        5、如下示例, 请用面向对象的形式优化以下代码
           在没有学习类这个概念时,数据与功能是分离的,如下
           def exc1(host,port,db,charset):
           conn=connect(host,port,db,charset)
           conn.execute(sql)
           return xxx
           def exc2(host,port,db,charset,proc_name)
           conn=connect(host,port,db,charset)
           conn.call_proc(sql)
           return xxx
           # 每次调用都需要重复传入一堆参数
           exc1('127.0.0.1',3306,'db1','utf8','select * from tb1;')
           exc2('127.0.0.1',3306,'db1','utf8','存储过程的名字')
    
        6、下面这段代码的输出结果将是什么?请解释。
            class Parent(object):
               x = 1
    
            class Child1(Parent):
               pass
    
            class Child2(Parent):
               pass
    
            print(Parent.x, Child1.x, Child2.x)
            Child1.x = 2
            print(Parent.x, Child1.x, Child2.x)
            Parent.x = 3
            print(Parent.x, Child1.x, Child2.x)
    
        7、定义学校类,实例化出:北京校区、上海校区两个对象
            校区独有的特征有:
                校区名=“xxx”
                校区地址={'city':"所在市",'district':'所在的区'}
                多们课程名=['xxx','yyy','zzz']
                多个班级名=['xxx','yyy','zzz']
    
            校区可以:
                1、创建班级
                2、查看本校区开设的所有班级名
                3、创建课程
                4、查看本校区开设的所有课程名
    
    
        8、定义出班级类,实例化出两个班级对象
            班级对象独有的特征:
                班级名=‘xxx’
                所属校区名=‘xxx’
                多门课程名=['xxx','yyy','zzz']
                多个讲师名=['xxx','xxx','xxx']
    
            班级可以:
                1、查看本班所有的课程
                2、查看本班的任课老师姓名
    
    
        9、定义课程类,实例化出python、linux、go三门课程对象
            课程对象独有的特征:
                课程名=‘xxx’
                周期=‘3mons’
                价格=3000
    
            课程对象可以:
                1、查看课程的详细信息
    
    
        10、定义学生类,实例化出张铁蛋、王三炮两名学生对象
            学生对象独有的特征:
                学号=10
                名字=”xxx“
                班级名=['xxx','yyy']
                分数=33
    
            学生可以:
                1、选择班级
                3、注册,将对象序列化到文件
    
    
        11、定义讲师类,实例化出egon,lqz,alex,wxx四名老师对象
            老师对象独有的特征:
                名字=“xxx”
                等级=“xxx”、
            老师可以:
                1、修改学生的成绩
    
    
        12、用面向对象的形式编写一个老师类, 老师有特征:编号、姓名、性别、年龄、等级、工资,老师类中有功能
            1、生成老师唯一编号的功能,可以用hashlib对当前时间加上老师的所有信息进行校验得到一个hash值来作为老师的编号
                def create_id(self):
                    pass
            2、获取老师所有信息
                def tell_info(self):
                    pass
    
            3、将老师对象序列化保存到文件里,文件名即老师的编号,提示功能如下
                def save(self):
                    with open('老师的编号','wb') as f:
                        pickle.dump(self,f)
    
            4、从文件夹中取出存储老师对象的文件,然后反序列化出老师对象,提示功能如下
                def get_obj_by_id(self,id):
                    return pickle.load(open(id,'rb'))
    
    
    
        13、按照定义老师的方式,再定义一个学生类
    
        14、抽象老师类与学生类得到父类,用继承的方式减少代码冗余
    
    
        15、基于面向对象设计一个对战游戏并使用继承优化代码,参考博客
            http://www.cnblogs.com/linhaifeng/articles/7340497.html#_label1
    作业
    # class OldboyStudent:
    #     school='oldboy'
    #     count = 0
    #
    #     def __init__(self,name,age,sex):
    #         self.count +=1
    #         self.name=name
    #         self.age=age
    #         self.sex=sex
    #         OldboyStudent.count += 1
    #
    #     def learn(self):
    #         print('%s is learning' %self.name) #新增self.name
    #
    #     def eat(self):
    #         print('%s is eating' %self.name)
    #
    #     def sleep(self):
    #         print('%s is sleeping' %self.name)
    #
    # s1=OldboyStudent('李坦克','男',18)
    # print(s1.count)
    # s2=OldboyStudent('王大炮','女',38)
    # print(s2.count)
    # s3=OldboyStudent('牛榴弹','男',78)
    # print(s3.count)
    #
    # class Parent1(object):
    #     pass
    #
    # class Parent2(object):
    #     pass
    #
    # class Sub1(Parent1,Parent2):
    #     pass
    #
    # print(Sub1.__bases__)
    # print(Parent1.__bases__)
    # print(Parent2.__bases__)
    #
    # class Parent(object):
    #     x = 1
    #
    #
    # class Child1(Parent):
    #     pass
    #
    #
    # class Child2(Parent):
    #     pass
    #
    #
    # print(Parent.x, Child1.x, Child2.x)
    #
    # Child1.x = 2
    # print(Parent.x, Child1.x, Child2.x)
    #
    # Parent.x = 3
    # print(Parent.x, Child1.x, Child2.x)
    
    # 7、定义学校类,实例化出:北京校区、上海校区两个对象
    # 校区独有的特征有:
    # 校区名 =“xxx”
    # 校区地址 = {'city': "所在市", 'district': '所在的区'}
    # 多们课程名 = ['xxx', 'yyy', 'zzz']
    # 多个班级名 = ['xxx', 'yyy', 'zzz']
    #
    # 校区可以:
    # 1、创建班级
    # 2、查看本校区开设的所有班级名
    # 3、创建课程
    # 4、查看本校区开设的所有课程名
    # class school:
    #     def __init__(self,name,addr,courses,classes):
    #         self.name=name
    #         self.addr=addr
    #         self.courses=courses
    #         self.classes=classes
    #
    #     def create_class(self,addcla):
    #         self.classes.append(addcla)
    #
    #     def view_class(self):
    #         return self.classes
    #
    #     def create_course(self,cour):
    #         self.courses.append(cour)
    #
    #     def view_course(self):
    #         return self.courses
    #
    # bj = school('bj',{'city': "bj", 'district': 'bj'},['python','linux'],['py1','py2'])
    # sh = school('sh',{'city': "sh", 'district': 'sh'},['python','linux'],['py1','py2'])
    # bj.create_class('py3')
    # print(bj.view_class())
    # bj.create_course('java')
    # print(bj.view_course())
    
    # 8、定义出班级类,实例化出两个班级对象
    # 班级对象独有的特征:
    # 班级名 =‘xxx’
    # 所属校区名 =‘xxx’
    # 多门课程名 = ['xxx', 'yyy', 'zzz']
    # 多个讲师名 = ['xxx', 'xxx', 'xxx']
    #
    # 班级可以:
    # 1、查看本班所有的课程
    # 2、查看本班的任课老师姓名
    # class classes:
    #     def __init__(self,ClaName,SchName,Courses,Teachers):
    #         self.name=ClaName
    #         self.schlool=SchName
    #         self.course=Courses
    #         self.teacher=Teachers
    #
    #     def view_courses(self):
    #         return self.course
    #     def view_teachers(self):
    #         return self.teacher
    #
    # py1 = classes('py1','sh',['python','linux','c'],['egon','lqz','ckq'])
    # py2 = classes('py2','sh',['python','linux','c'],['egon','lqz','ckq'])
    # print(py1.view_courses(),py1.view_teachers())
    # print(py2.view_courses(),py2.view_teachers())
    
    # 9、定义课程类,实例化出python、linux、go三门课程对象
    # 课程对象独有的特征:
    # 课程名 =‘xxx’
    # 周期 =‘3mons’
    # 价格 = 3000
    #
    # 课程对象可以:
    # 1、查看课程的详细信息
    # class course:
    #     def __init__(self,curriculum_name,price=3000,period='3mons',):
    #         self.c_name=curriculum_name
    #         self.price=price
    #         self.period=period
    #     def CheckCourse(self):
    #         return '课程名:%s 周期:%s 价格:%s' %(self.c_name,self.period,self.price)
    #
    # python = course('python')
    # linux = course('linux')
    # go = course('go')
    # print(python.CheckCourse())
    # print(linux.CheckCourse())
    # print(go.CheckCourse())
    
    # 10、定义学生类,实例化出张铁蛋、王三炮两名学生对象
    # 学生对象独有的特征:
    # 学号 = 10
    # 名字 =”xxx“
    # 班级名 = ['xxx', 'yyy']
    # 分数 = 33
    #
    # 学生可以:
    # 1、选择班级
    # 3、注册,将对象序列化到文件
    
    # import json
    # class students:
    #     def __init__(self,name,cla_name,score=33,stu_num=10):
    #         self.stu_num=stu_num
    #         self.name=name
    #         self.cla_name=cla_name
    #         self.score=score
    #     def choice_class(self,cho_cla):
    #         self.chocla=cho_cla
    #     def register(self):
    #         user_dic = {'学号':self.stu_num,'姓名':self.name,'班级名':self.cla_name,'分数':self.score,'选择班级':self.chocla}
    #         user_path = '%s.json' %self.name
    #         with open(user_path,'w',encoding='utf-8') as f:
    #             json.dump(user_dic,f)
    #             f.flush()
    # stu1 = students('张铁蛋',['python1','linux1'])
    # stu2 = students('王三炮',['python2','linux2'])
    # stu1.choice_class('python')
    # stu2.choice_class('linux')
    # stu1.register()
    # stu2.register()
    
    # 11、定义讲师类,实例化出egon,lqz,alex,wxx四名老师对象
    # 老师对象独有的特征:
    # 名字 =“xxx”
    # 等级 =“xxx”、
    # 老师可以:
    # 1、修改学生的成绩
    # class teachers:
    #     def __init__(self,name,level):
    #         self.name=name
    #         self.level=level
    #     def change_score(self,stu,score):
    #         stu.score = score
    # egon = teachers('egon',10)
    # lqz = teachers('lqz',10)
    # alex = teachers('alex',10)
    # wxx = teachers('wxx',10)
    # egon.change_score(stu1,40)
    # print(stu1.score)
    
    # import hashlib
    # import time
    # import pickle
    #
    #
    # class teachers:
    #     def __init__(self, name, sex, age, level, salary):
    #         self.name = name
    #         self.sex = sex
    #         self.age = age
    #         self.level = level
    #         self.salary = salary
    #
    #     def create_id(self):
    #         m = hashlib.md5()
    #         join = str(time.time()) + self.name + self.sex + str(self.age) + str(self.level) + str(self.salary)
    #         m.update(join.encode('utf-8'))
    #         self.number = m.hexdigest()
    #
    #     def tell_info(self):
    #         return '编号:%s 姓名:%s 性别:%s 年龄:%s 等级:%s工资:%s' % (
    #             self.number, self.name, self.sex, self.age, self.level, self.salary)
    #
    #     def save(self):
    #         # db_tea = self.number
    #         tea_dic = {'编号': self.number, '姓名': self.name, '性别': self.sex, '年龄': self.age, '等级': self.level,
    #                    '工资': self.salary}
    #         with open(self.number, 'wb') as f:
    #             pickle.dump(tea_dic, f)
    #             f.flush()
    #
    #     def get_obj_by_id(self, id):
    #         with open(id,'rb') as f:
    #             return pickle.load(f)
    
    # egon = teachers('egon','male',18,10,100)
    # egon.create_id()
    # print(egon.tell_info())
    # egon.save()
    # print(egon.get_obj_by_id('29a42b1882e2141049a57f723a75082b'))
    
    
    ##13
    # import hashlib
    # import time
    # import pickle
    # class students:
    #     def __init__(self,name,sex,age):
    #         self.name=name
    #         self.sex=sex
    #         self.age=age
    #
    #     def create_id(self):
    #         m=hashlib.md5()
    #         join = str(time.time())+self.name+self.sex+str(self.age)
    #         m.update(join.encode('utf-8'))
    #         self.number=m.hexdigest()
    #     def tell_info(self):
    #         return '姓名:%s 性别:%s 年龄:%s 学号:%s' %(self.name,self.sex,self.age,self.number)
    #     def save(self):
    #         stu_dic = {'name':self.name,'sex':self.sex,'age':self.age,'number':self.number}
    #         with open(self.number,'wb') as f:
    #             pickle.dump(stu_dic,f)
    #             f.flush()
    #     def get_obj_by_id(self, id):
    #         with open(id,'rb') as f:
    #             return pickle.load(f)
    
    # stu1 = students('xjj','male',18)
    # stu1.create_id()
    # print(stu1.tell_info())
    # stu1.save()
    # print(stu1.get_obj_by_id('ea1fd3d4cd6b7a119a2e909050c48c40'))
    
    # import hashlib
    # import time
    # import pickle
    #
    # class people:
    #     def __init__(self,name,sex,age):
    #         self.name=name
    #         self.sex=sex
    #         self.age=age
    #     def create_id(self):
    #         join = str(time.time())+self.name+self.sex+str(self.age)
    #         m=hashlib.md5()
    #         m.update(join.encode('utf-8'))
    #         self.number=m.hexdigest()
    #
    # class students:
    #     def __init__(self,name,sex,age):
    #         people.__init__(self,name,sex,age)
    #
    #
    #     def create_id(self):
    #         m=hashlib.md5()
    #         join = str(time.time())+self.name+self.sex+str(self.age)
    #         m.update(join.encode('utf-8'))
    #         self.number=m.hexdigest()
    #     def tell_info(self):
    #         return '姓名:%s 性别:%s 年龄:%s 学号:%s' %(self.name,self.sex,self.age,self.number)
    #     def save(self):
    #         stu_dic = {'name':self.name,'sex':self.sex,'age':self.age,'number':self.number}
    #         with open(self.number,'wb') as f:
    #             pickle.dump(stu_dic,f)
    #             f.flush()
    #     def get_obj_by_id(self, id):
    #         with open(id,'rb') as f:
    #             return pickle.load(f)
    #
    # class teachers:
    #     def __init__(self, name, sex, age, level, salary):
    #         people.__init__(self,name,sex,age)
    #         self.level = level
    #         self.salary = salary
    #
    #     def create_id(self):
    #         m = hashlib.md5()
    #         join = str(time.time()) + self.name + self.sex + str(self.age) + str(self.level) + str(self.salary)
    #         m.update(join.encode('utf-8'))
    #         self.number = m.hexdigest()
    #
    #     def tell_info(self):
    #         return '编号:%s 姓名:%s 性别:%s 年龄:%s 等级:%s工资:%s' % (
    #             self.number, self.name, self.sex, self.age, self.level, self.salary)
    #
    #     def save(self):
    #         # db_tea = self.number
    #         tea_dic = {'编号': self.number, '姓名': self.name, '性别': self.sex, '年龄': self.age, '等级': self.level,
    #                    '工资': self.salary}
    #         with open(self.number, 'wb') as f:
    #             pickle.dump(tea_dic, f)
    #             f.flush()
    #
    #     def get_obj_by_id(self, id):
    #         with open(id,'rb') as f:
    #             return pickle.load(f)
    
    class Riven:
        camp = 'Noxus'
    
        def __init__(self, nickname,
                     aggressivity=54,
                     life_value=414,
                     money=1001,
                     armor=3):
            self.nickname = nickname
            self.aggressivity = aggressivity
            self.life_value = life_value
            self.money = money
            self.armor = armor
    
        def attack(self, enemy):
            damage_value = self.aggressivity - enemy.armor
            enemy.life_value -= damage_value
    
    
    class Garen:
        camp = 'Demacia'
    
        def __init__(self, nickname,
                     aggressivity=58,
                     life_value=455,
                     money=100,
                     armor=10):
            self.nickname = nickname
            self.aggressivity = aggressivity
            self.life_value = life_value
            self.money = money
            self.armor = armor
    
        def attack(self, enemy):
            damage_value = self.aggressivity - enemy.armor
            enemy.life_value -= damage_value
    
    
    class BlackCleaver:
        def __init__(self, price=475, aggrev=9, life_value=100):
            self.price = price
            self.aggrev = aggrev
            self.life_value = life_value
    
        def update(self, obj):
            obj.money -= self.price  # 减钱
            obj.aggressivity += self.aggrev  # 加攻击
            obj.life_value += self.life_value  # 加生命值
    
        def fire(self, obj):  # 这是该装备的主动技能,喷火,烧死对方
            obj.life_value -= 1000  # 假设火烧的攻击力是1000
    
    r1=Riven('草丛伦')
    g1=Garen('盖文')
    b1=BlackCleaver()
    
    print(r1.aggressivity,r1.life_value,r1.money)
    
    if r1.money > b1.price:
        r1.b1=b1   #组合
        b1.update(r1)
    
    
    print(r1.aggressivity,r1.life_value,r1.money) #r1的攻击力,生命值,护甲
    
    print(g1.life_value)
    r1.attack(g1) #普通攻击
    print(g1.life_value)
    r1.b1.fire(g1) #用装备攻击
    print(g1.life_value) #g1的生命值小于0就死了
    View Code
  • 相关阅读:
    docker 镜像管理
    docker 常用操作
    docker 简单介绍与安装
    emacs 缩进
    stl标准库 iterator_traits
    emacs semantic,speedbar,gdb汇总
    在emacs 里使用gdb
    emacs speedbar功能介绍
    前端基础之BOM和DOM
    modules模块
  • 原文地址:https://www.cnblogs.com/xujinjin18/p/9229348.html
Copyright © 2020-2023  润新知