day20

1.下面这段代码的输出结果将是什么?请解释。

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,2,3

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


        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()  # G D A B
           f = F()  # F C B D A
    新式类的查找从左边一条支路开始查找,找到两条分支共同的父类前面那个类,然后返回查找下一条分支,直到找完所有的分支,然后再找共同的父类。

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

1.python3默认都是新式类
2.python2中才有新式类和经典类的区别,新式类是继承object的类,经典类是没有继承object类。
3.区别是有没有继承object类
4.深度优先是经典类的属性查找方式,深度优先从左到右依次一个一个分支查找,而且如果分支有公共父类,在第一条分支当中就把这个父类查找了
5.广度优先是新式类的属性查找方式,它和深度优先的区别是最后查找公共父类

4.用面向对象的形式编写一个老师类, 老师有特征:编号、姓名、性别、年龄、等级、工资,老师类中有功能。

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

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

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

# -*-coding:utf-8-*-
# Author: yqliu
# CreatDate: 2019/10/11 14:24

import time
import hashlib
import pickle
#基类
class People:
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
    def create_id(self):
        info = time.strftime('%Y-%m-%d') + self.name + str(self.age) + str(self.sex)
        m=hashlib.md5()
        m.update(info.encode('utf-8'))
        self.id=m.hexdigest()
        return self.id
    def save(self):
        with open(f'{self.create_id()}','wb') as fw:
            pickle.dump(self.tell(),fw)
    def get_obj_by_id(self):
        with open(f'{self.create_id()}','rb') as fr:
           return pickle.load(fr)
#老师类
class Teacher(People):
    def __init__(self,name,age,sex,level,salary):
        super().__init__(name,age,sex)
        self.level=level
        self.salary=salary

    def tell(self):
        info={
            'name':self.name,
            "age":self.age,
            'sex':self.sex,
            'level':self.level,
            'salary':self.salary,
            'id':self.create_id(),

        }
        print (info)
        return info

#学生类
class Student(People):
    def __init__(self,name,age,sex,course):
        super().__init__(name,age,sex)
        self.course=course

    def tell(self):
        info={
            'name':self.name,
            'age':self.age,
            'sex':self.sex,
            'course':self.course,
            'id':self.create_id(),
        }
        print (info)
        return info

teacher_tank=Teacher('tank',19,'male',10,30)

teacher_tank.tell()

id=teacher_tank.create_id()
print (id)

teacher_tank.save()
res2=teacher_tank.get_obj_by_id()
print (res2,type(res2))

print ("*"*100)
stu1=Student('yqliu',10,'male','python')
stu1.tell()
id=stu1.create_id()
print (id)
stu1.save()
res3=stu1.get_obj_by_id()
print (res3)
posted @ 2019-10-10 23:32  ztzdhbg  阅读(179)  评论(0编辑  收藏  举报