1.如下示例, 请用面向对象的形式优化以下代码
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','存储过程的名字')
import pymysql
class func_exc(object):
def __init__(self, host, port, db, charset=None):
self.host = host
self.port = port
self.db = db
self.charset = charset
def exc11(self, sql):
conn = pymysql.connect(self.host, self.port, self.db, self.charset)
conn.execute(self.sql)
return conn
def exc22(self, pro_name):
conn = pymysql.connect(self.host, self.port, self.db, self.charset)
conn.call_proc(pro_name)
return conn
exc1, 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 random
class Object(object):
def __init__(self, name, blood_volume, attack_ability):
self.name = name
self.blood_volume = blood_volume
self.attack_ability = attack_ability
class Person(Object):
def attack(self, dog):
dog.blood_volume = dog.blood_volume - self.attack_ability
class Dog(Object):
def attack(self, person):
person.blood_volume = person.blood_volume - self.attack_ability
def 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 = 0
def __init__(self):
self.sum()
@classmethod
def sum(cls):
cls.count += 1
Student()
Student()
print(Student.count)
# 2