python-week6

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chde2Wang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值