作业16
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','存储过程的名字')
优化如下:
def func(): obj_dict = {'HOST': '127.0.0.1', 'PORT': 3306, 'DB': 'db1', 'CHARSET': 'utf-8'} 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(obj_dict, 'select * from tb1') exc2(obj_dict, '存储过程的名字')
6.下面这段代码的输出结果是什么,请解释
class Parent(object): x = 1 class Child1(Parent): pass class Child2(Parent): pass print(Parent.x, Child1.x, Child2.x) Parent是Child1与Child2的父类,Child1与Child2的类里没有x则会 查找父类中的x,结果是1,1,1 Child1.x = 2 print(Parent.x, Child1.x, Child2.x) 若子类当前有x则会以子类的x为准, 结果为1,2,1 Parent.x = 3 print(Parent.x, Child1.x, Child2.x) 此处更改了父类里的x,所以继承的子类也会相应改变,但仍然会以子类当前的x为准 结果为3,2,3
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() super方法会得到一个对象,该对象就是专门用来访问父类中的属性的,根据super按照mro列表依次查找顺序为 G-->D-->A-->B
8.什么是新式类,什么是经典类,二者有什么区别?什么是深度优先,什么是广度优先?
但凡继承了object的类以及子子类....都称之为新式类
但凡没有继承object的类以及子子类...都称之为经典类
深度优先会一层层的找到最顶端的那个非object类
广度优先则会最后查找最顶端的非object类
9.用面向对象的形式编写一个老师类,老师有特征:编号,姓名,性别,年龄,等级,工资,
老师类中有以下功能:
1.生成老师唯一编号的功能,可以用hashlib对当前时间加上老师的所有信息进行校验得到一个hash值来作为老师的编号
2.获取老师所有信息
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.抽象老师类与学生类得到父类,用继承的方式减少代码冗余
import hashlib import time import pickle class OldboyPeople: def __init__(self, name, gender, age, level, salary): self.name = name self.gender = gender self.age = age self.level = level self.salary = salary def create_id(self): m = hashlib.md5() t = str(time.time()) s = str(self.__dict__) m.update(t.encode('utf-8')) m.update(s.encode('utf-8')) t1.num = m.hexdigest() def tell_info(self): print(self.__dict__) def save(self): with open(t1.num,'wb') as f: pickle.dump(self.__dict__, f) def get_obj_by_id(self, num): return pickle.load(open(self.num, 'rb')) class Teacher(OldboyPeople): def __init__(self,name, gender, age, level, salary): OldboyPeople.__init__(self, name, gender, age) self.level = level self.salary = salary class Students(OldboyPeople): def __init__(self,name, gender, age): OldboyPeople.__init__(self, name, gender, age) t1 = Teacher('egon', 'male', 18, 10, 10000) s1 = Students('kevin', 'male', 18) t1.create_id() t1.tell_info() t1.get_obj_by_id(t1.num)
10.基于一个面向对象设计一个对战游戏并使用继承优化代码
class Fight: def __init__(self, name, agg, blood=300): self.name = name self.agg = agg self.blood = blood def bite(self, enemy): enemy.blood -= self.agg print('%s咬了一口%s,%s还剩余%s血量' % ( self.name, enemy.name, enemy.name, enemy.blood)) class People(Fight): def __init__(self, name, agg): Fight.__init__(self, 'egon', 50) class Dog(Fight): def __init__(self, name, agg): Fight.__init__(self, '吉娃娃', 45) p1 = People('egon', 60) d1 = Dog('吉娃娃', 50) p1.bite(d1) d1.bite(p1)