• day25作业


    1、类的属性和对象的属性有什么区别?

    类的属性可以被类名和所有类声明对象调用到,而对象的属性只能由对象来调用到。

    2、面向过程编程与面向对象编程的区别与应用场景?

    面向过程的编程主要是依照流程来编程的一种编程思想,使用对扩展性小,像是linux内核,shell脚本

    面向对象编程主要依照对象来实现功能的一种编程思想,具有较好扩展性,使用与用户交互的程序。

    3、类和对象在内存中是如何保存的。

    类在执行时,开辟一个名称空间,执行类中代码将名字保存到名称空间。

    对象在声明时,创建一个空对象,对象的名称空间保存内存的独有的属性。

    4、什么是绑定到对象的方法,、如何定义,如何调用,给谁用?有什么特性

    通过self来将对象和函数绑定,调用是会将对象自动传给对象方法的第一参数

    对象定义绑定的方法:

    class 类名:
        
        def 方法(self):
            代码体

    调用

    对象名.对象方法(参数)

    提供给类声明的对象使用

    特性:调用要能通过对象调用,或是将对象作为第一参数传入调用(类名。绑定方法(对象,参数)调用)

    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','存储过程的名字')

    答案:

    class excl:
        def __init__(self,host,port,db,charset,proc_name):
            self.host = host
            self.prot = port
            self.db = db
            self.charset = charset
            self.proc_name = proc_name
    
        def exc1(self,sql):
            conn = connect(self.host, self.port, self.db, self.charset)
            conn.execute(sql)
            return xxx
    
        def exc2(self,sql):
            conn = connect(self.host, self.port, self.db, self.charset)
            conn.call_proc(sql)
            return xxx

    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)

    1 1 1 Child1 和Child2都没有自己的x属性,所以只能调用父类Parent中x属性。

    1 2 1child1中新增了一个x属性=2,所以child1的x属性就是等于2

    3 2 3child1中已经新增了一个x属性,不需要调用parent中x属性,child3没有x属性,只能调用parent中的属性x。

    7、多重继承的执行顺序,请解答以下输出结果是什么?并解释。

    class A(object):
       def __init__(self):
           print('A')
           super(A, self).__init__()
    
    class B(object):
       def __init__(self):
           print('B')
           super(B, self).__init__()
    
    class C(A):
       def __init__(self):
           print('C')
           super(C, self).__init__()
    
    class D(A):
       def __init__(self):
           print('D')
           super(D, self).__init__()
    
    class E(B, C):
       def __init__(self):
           print('E')
           super(E, self).__init__()
    
    class F(C, B, D):
       def __init__(self):
           print('F')
           super(F, self).__init__()
    
    class G(D, B):
       def __init__(self):
           print('G')
           super(G, self).__init__()
    
    if __name__ == '__main__':
       g = G()
       f = F()

    结果:GDABFCBDA

    class A(object):
       def __init__(self):
           print('A')#6打印A
           super(A, self).__init__()# 7 找对象g mro列表中__init__最先的__init__函数(是B类的__init__),已经移动过G class,
           #object 不符合对象广度优先的原则
    
    class B(object):
       def __init__(self):
           print('B')# 8 打印B
           super(B, self).__init__()#最后查找object.__init__(),结束
    
    class C(A):
       def __init__(self):
           print('C')
           super(C, self).__init__()
    
    class D(A):
       def __init__(self):
           print('D')#4 打印 D
           super(D, self).__init__()# 5 找对象g mro列表中__init__最先的__init__函数(是A类的__init__),已经移动过G class
    
    class E(B, C):
       def __init__(self):
           print('E')
           super(E, self).__init__()
    
    class F(C, B, D):
       def __init__(self):
           print('F')
           super(F, self).__init__()
    
    class G(D, B):
       def __init__(self):
           print('G')#2 打印G
           super(G, self).__init__()#3找对象g mro列表中__init__最先的__init__函数(是D类的__init__)
    
    if __name__ == '__main__':
        #[<class '__main__.G'>, <class '__main__.D'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]
        g = G()#1.调用G__init__函数
        #F--->C---->B---->D---->A---->object
        print(F.mro())
        f = F()

    8、什么是新式类,什么是经典类,二者有什么区别?什么是深度优先,什么是广度优先?

    新式类:但凡继承object类的子类,以及该子类的子子类……都称之为新式类。

    经典类:没有继承object类的子类,以及该子类的子子类……都称之为经典类。

    在菱形继承的情况下,

    经典类是深度优先:有左边的分支开始,追溯到最后非object类,在追溯其他分支,最后追溯总结点非object类, 再追溯object。

    新式类是广度优先:从左边的分支开始,追溯到最后除了,再追其他分支,当最后追溯到总结点非object 再追溯object。

    9、用面向对象的形式编写一个老师类, 老师有特征:编号、姓名、性别、年龄、等级、工资,老师类中有功能
    1、生成老师唯一编号的功能,可以用hashlib对当前时间加上老师的所有信息进行校验得到一个hash值来作为老师的编号

    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'))

    import time,hashlib,pickle
    class Teacher:
        def __init__(self,name,gender,age,level,salaries):
            self.name = name
            self.gender = gender
            self.age = age
            self.level =level
            self.salaries = salaries
            self.id =self.creat_id()
    
        def creat_id(self):
            info= "%s%s%s%s%s"%(self.name,self.gender,self.age,self.level,self.salaries)
            m1 = hashlib.md5(info.encode('utf-8'))
            m1.update(str(time.time()).encode('utf-8'))
            return m1.hexdigest()
    
        def tell_info(self):
            print("id %s|name %s|gender %s|age %s|level %s|salaries %s"
                  %(self.id,self.name,self.gender,self.age,self.level,self.salaries))
    
        def save(self):
            with open('%s'%self.id,'wb') as f:
                pickle.dump(self,f)
    
        def get_obj_by_id(self,id):
            with open('%s'%id,'rb') as f:
                res =pickle.load(f)
            return res
    
    
    
    
    
    # tea1 = Teacher('egon','male',18,10,3000)
    # tea1.tell_info()
    # tea1.save()
    

    10、按照定义老师的方式,再定义一个学生类

    class Student:
        def __init__(self, name, gender, age):
            self.name = name
            self.gender = gender
            self.age = age
    
        def tell_info(self):
            print('name %s|gender %s|age %s|' % (self.name, self.gender, self.age), end=' ')

    11、抽象老师类与学生类得到父类,用继承的方式减少代码冗余

    import time,hashlib,pickle
    class PeopleInfo:
        def __init__(self,name,gender,age):
            self.name = name
            self.gender = gender
            self.age = age
    
        def tell_info(self):
            print('name %s|gender %s|age %s|'%(self.name,self.gender,self.age),end=' ')
    
    class Teacher(PeopleInfo):
        def __init__(self,name,gender,age,level,salaries):
            super().__init__(name,gender)
            self.level =level
            self.salaries = salaries
            self.id =self.creat_id()
    
        def creat_id(self):
            info= "%s%s%s%s%s"%(self.name,self.gender,self.age,self.level,self.salaries)
            m1 = hashlib.md5(info.encode('utf-8'))
            m1.update(str(time.time()).encode('utf-8'))
            return m1.hexdigest()
    
        def tell_info(self):
            print('id %s|'%self.id)
            super().tell_info()
            print("level %s|salaries %s"%(self.salaries))
    
        def save(self):
            with open('%s'%self.id,'wb') as f:
                pickle.dump(self,f)
    
        def get_obj_by_id(self,id):
            with open('%s'%id,'rb') as f:
                res =pickle.load(f)
            return res
    
    
    class Student(PeopleInfo):
        pass
    View Code

    12、基于面向对象设计一个对战游戏并使用继承优化代码,参考博客

    http://www.cnblogs.com/linhaifeng/articles/7340497.html#_label1

    class Hero:
        def __init__(self,camp,nickname,aggressivity,life_value,money,armor):
            self.camp =camp
            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
            print('%s 攻击%s'%(self.nickname,enemy.nickname))
            enemy.life_value-=damage_value
            print('%s 收到 %s 伤害 剩余血量 %s'%(enemy.nickname,damage_value,enemy.life_value))
            if enemy.life_value <= 0:
                print('%s 已死亡'%enemy.nickname)
    
    class Equipment:
        def __init__(self, name,price, aggrev, life_value):
            self.name = name
            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  # 加生命值
    
    class BlackCleaver(Equipment):
        def fire(self, enemy):  # 这是该装备的主动技能,喷火,烧死对方
            enemy.life_value -= 300  # 假设火烧的攻击力是300
            if enemy.life_value <= 0:
                print('%s 已死亡'%enemy.name)
    
    
    riven = Hero('Noxus','Riven',54,414,1001,12)
    garen =Hero('Demacia','Demacia',56,455,500,19)
    BC = BlackCleaver('bbff',400,9,100)
    while True:
        if riven.money>BC.price:
            BC.update(riven)
        if garen.money>BC.price:
            BC.update(garen)
        riven.attack(garen)
        garen.attack(riven)
        if riven.life_value <=0 or garen.life_value<=0:
            print('对战结束')
            break
    View Code
  • 相关阅读:
    combobox下拉框只能选择不能编辑
    nginx 虚拟主机
    nginx加密网站
    nginx平滑升级
    http网站加密
    CentOS下网卡启动、配置等ifcfg-eth0教程
    CentOS5.6系统中安装并使用USB无线网卡(配置成功) 转
    【RedHat/Centos】利用iso镜像做本地yum源 转
    centOS6.0 64 位将光盘作为yum源(转)
    Linux安装无线网卡驱动,实现Linux无线上网 转
  • 原文地址:https://www.cnblogs.com/msj513/p/9839466.html
Copyright © 2020-2023  润新知