1.如下示例, 请用面向对象的形式优化以下代码
def exc1(host,port,db,charset):conn=connect(host,port,db,charset)conn.execute(sql)return xxxdef 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','存储过程的名字')
import pymysqlclass func_exc(object):def __init__(self, host, port, db, charset=None):self.host = hostself.port = portself.db = dbself.charset = charsetdef exc11(self, sql):conn = pymysql.connect(self.host, self.port, self.db, self.charset)conn.execute(self.sql)return conndef exc22(self, pro_name):conn = pymysql.connect(self.host, self.port, self.db, self.charset)conn.call_proc(pro_name)return connexc1, exc2 = func_exc('127.0.0.1',3306,'db1','utf8')
exc1.exc11('select * from tb1')
exc2.exc22('proc_name')
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()print('-------')f = F()
输出结果为: G D A B ------ F C B D A
# 初始化方法重写 且有super 父类 子类方法都会调用
# 子类不重写 __init__,实例化子类时,会自动调用父类定义的 __init__。
# 如果重写了__init__ 时,实例化子类,就不会调用父类已经定义的 __init__
# 如果重写了__init__ 时,要继承父类的构造方法,可以使用 super 关键字# 多继承问题 继承顺序
# 经典类 : 就是深度优先,公共父类被多次执行。
# 新式类 :广度优先搜索,公共父类只执行一次
eg:
经典类:
class A:def __init__(self):print("Enter A")print("Leave A")class B(A):def __init__(self):print("Enter B")A.__init__(self)print("Leave B")class C(A):def __init__(self):print("Enter C")A.__init__(self)print("Leave C")class D(A):def __init__(self):print("Enter D")A.__init__(self)print("Leave D")class E(B, C, D):def __init__(self):print("Enter E")B.__init__(self)C.__init__(self)D.__init__(self)print("Leave E")E()
# ---执行结果----
# Enter E
# Enter B
# Enter A
# Leave A
# Leave B
# Enter C
# Enter A
# Leave A
# Leave C
# Enter D
# Enter A
# Leave A
# Leave D
# Leave E
新式类:
class A(object):def __init__(self):print("Enter A")print("Leave A")class B(A):def __init__(self):print("Enter B")super(B, self).__init__()print("Leave B")class C(A):def __init__(self):print("Enter C")super(C, self).__init__()print("Leave C")class D(A):def __init__(self):print("Enter D")super(D, self).__init__()print("Leave D")class E(B, C, D):def __init__(self):print("Enter E")super(E, self).__init__()print("Leave E")E()
# ---执行结果----
# Enter E
# Enter B
# Enter C
# Enter D
# Enter A
# Leave A
# Leave D
# Leave C
# Leave B
# Leave E
3、请写一个小游戏,人狗大站,2个角色,人和狗,游戏开始后,生成2个人,3条狗,互相混战,人被狗咬了会掉血,狗被人打了也掉血,狗和人的攻击力,具备的功能都不一样。注意,请按题14领域建模的方式来设计类。
"""
File: 人狗大战3.py
Author: chde_wang
Date: 2020-09-13 12:15:03
Description:
"""
import randomclass Object(object):def __init__(self, name, blood_volume, attack_ability):self.name = nameself.blood_volume = blood_volumeself.attack_ability = attack_abilityclass Person(Object):def attack(self, dog):dog.blood_volume = dog.blood_volume - self.attack_abilityclass Dog(Object):def attack(self, person):person.blood_volume = person.blood_volume - self.attack_abilitydef person_attack_dog(person_list, dog_list):for i in range(len(person_list)):num = random.randint(0, 1)if num == 0:person_list[i].attack(dog_list[0])print(person_list[i].name + "攻击了" + dog_list[0].name,dog_list[0].name + "血量为:" + str(dog_list[0].blood_volume))elif num == 1:person_list[i].attack(dog_list[1])print(person_list[i].name + "攻击了" + dog_list[1].name,dog_list[1].name + "血量为:" + str(dog_list[1].blood_volume))def dog_attack_person(person_list, dog_list):for i in range(len(dog_list)):num = random.randint(0, 2)if num == 0:dog_list[i].attack(person_list[0])print(dog_list[i].name + "攻击了" + person_list[0].name,person_list[0].name + "血量为:" + str(person_list[0].blood_volume))elif num == 1:dog_list[i].attack(person_list[1])print(dog_list[i].name + "攻击了" + person_list[1].name,person_list[1].name + "血量为:" + str(person_list[1].blood_volume))elif num == 2:dog_list[i].attack(person_list[2])print(dog_list[i].name + "攻击了" + person_list[2].name,person_list[2].name + "血量为:" + str(person_list[2].blood_volume))p1 = Person("小明", 100, 5)
p2 = Person("小张", 100, 4)
p3 = Person("小白", 100, 6)
d1 = Dog("旺财", 100, 7)
d2 = Dog("黑宝", 100, 3)person_list = []
person_list.append(p1)
person_list.append(p2)
person_list.append(p3)dog_list = []
dog_list.append(d1)
dog_list.append(d2)person_attack_dog(person_list, dog_list)
print('--------------')
dog_attack_person(person_list, dog_list)#小明攻击了黑宝 黑宝血量为:95
#小张攻击了黑宝 黑宝血量为:91
#小白攻击了黑宝 黑宝血量为:85
#--------------
#旺财攻击了小张 小张血量为:93
#黑宝攻击了小明 小明血量为:97
4、编写程序, 编写一个学生类, 要求有一个计数器的属性, 统计总共实例化了多少个学生.(提示:@classmethod)
class Student(object):count = 0def __init__(self):self.sum()@classmethoddef sum(cls):cls.count += 1Student()
Student()
print(Student.count)
# 2