作业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)
posted @ 2018-10-23 21:16  BlackLinks  阅读(144)  评论(0编辑  收藏  举报