4.20作业

1、类的属性和对象的属性有什么区别?
类的属性:
数据属性:共享给所有对象使用的
函数属性:绑定给对象使用的
对象属性:对象的属性都是自己所独有的

2、面向过程编程与面向对象编程的区别与应用场景?
面向过程:核心是‘过程’二字,机械式的思想,将复杂的问题流程化进而简单化,,,适用于扩展性要求低的场景
面向对象:核心是‘对象’二字,‘上帝式’的思维方式,创造对象,通过对象之间的交互来完成编程,可扩展性极高,但是编程难度很大。。。。适用于需要经常修改功能的场景
3、类和对象在内存中是如何保存的。
定义类时,产生类的名称空间,类体内产生的名字都存在类的名称空间中
调用类时,产生一个空对象,再调用__init__函数,self参数接收对象本身,调用类时括号内的参数作为对象的独有属性,存放的对象的名称空间中

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','存储过程的名字')
class Sql:
    def __init__(self,host,port,db,charset,proc_name):
        self.host = host
        self.port = port
        self.db = db
        self.charset = charset
        self.proc_name = proc_name

    def exc1(self):
        conn = connect(self.host,self.port,self.db,self.charset)
        conn.execute(sql)
        return xxx
    def exc2(self):
        conn = connect(self.host, self.port, self.db, self.charset, self.proc_name)
        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)
1 1 1 
对象自己没有,找子类,子类没有,找父类

Child1.x = 2
print(Parent.x, Child1.x, Child2.x)
1 2 1
对象自己有,以自己的为准

Parent.x = 3
print(Parent.x, Child1.x, Child2.x)
3 3 3
对象自己没有,找子类,子类没有,找父类

 

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

 class A(object):
    def __init__(self):
        print(')
        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__()                                       
g = G()
           [<class '__main__.G'>, <class '__main__.D'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]
           非菱形结构,按照分支依次查找
           结果  G D A B


 f = F()
            [<class '__main__.F'>, <class '__main__.C'>, <class '__main__.B'>, <class '__main__.D'>, <class '__main__.A'>, <class 'object'>]    
            新式类菱形结构
                按照广度优先
            结果:F C B D A
答案

 

8、什么是新式类,什么是经典类,二者有什么区别?什么是深度优先,什么是广度优先?
   新式类:继承object的类,以及该类的子类,都是新式类

      在python3中,如果一个类没有指定继承的父类,默认就继承object,

        所以python3中所有的类都是新式类

    经典类:(只有在python2才区分经典类和新式类)

      没有继承object的类,以及该类的子类,都是经典类

深度优先:继承关系是菱形结构时,经典类查找属性使用深度优先原则,即第一个分支直接查找到最后一个,在开始下一个分支的查找
广度优先:继承关系是菱形结构时,新式类查找属性使用广度优先的原则,即每个分支在查到了最后一个之前,开始下一个分支的查找,由最后一个分支完成最后一个父类的查找

 

9、用面向对象的形式编写一个老师类, 老师有特征:编号、姓名、性别、年龄、等级、工资,老师类中有功能
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'))

 

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

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

 1 import hashlib
 2 import pickle
 3 import time
 4 
 5 
 6 class Teacher_Student:
 7     def __init__(self,name,age,sex,):
 8         self.name = name
 9         self.age = age
10         self.sex = sex
11 
12     def create_id(self):
13         create_id_msg = ('%s%s%s' %(self.name,self.age,self.sex))
14         create_id_msg =  create_id_msg.encode('utf-8')
15         create_time = str(time.time()).encode('utf-8')
16         teacher_id = hashlib.md5()
17         teacher_id.update(create_time)
18         teacher_id.update(create_id_msg)
19         return teacher_id.hexdigest()
20 
21     def tell_info(self):
22         print("""
23           ===========个人信息=============
24           姓名:%s
25           年龄:%s
26           性别:%s
27           """ % (self.name, self.age, self.sex))
28 
29     def save(self, id):
30         with open(id, 'wb') as f:
31             pickle.dump(self, f)
32 
33     def get_obj_by_id(self, id):
34         return pickle.load(open(id, 'rb'))
35 
36 class Teacher(Teacher_Student):
37     def __init__(self,name,age,sex,level,saraly):
38         #Teacher_Student.__init__(self,name,age,sex)
39         super().__init__(name,age,sex)
40         self.level = level
41         self.salary = saraly
42 
43     def create_id(self):
44         super().create_id()
45         create_id_msg = ('%s%s' %(self.level,self.salary))
46         create_id_msg =  create_id_msg.encode('utf-8')
47         create_time = str(time.time()).encode('utf-8')
48         teacher_id = hashlib.md5()
49         teacher_id.update(create_time)
50         teacher_id.update(create_id_msg)
51         return teacher_id.hexdigest()
52 
53     def tell_info(self):
54         super().tell_info()
55         print("""
56         等级:%s
57         薪资:%s
58         """ %(self.level,self.salary))
59 
60 # teac1 = Teacher('egon',18,'male',9,3.1)
61 # res = teac1.create_id()
62 # print(res)
63 # teac1.tell_info()
64 # teac1.save('e373a59d36d84dad27d29db560faa16d')
65 # teac1.get_obj_by_id('e373a59d36d84dad27d29db560faa16d')
66 
67 class Student(Teacher_Student):
68     pass
69  #可以参照老师类定制学生自己的属性
三合一答案

 

posted @ 2018-04-12 19:00  木夂口  阅读(200)  评论(0编辑  收藏  举报
levels of contents