Python课程设计 第 25 / 52 篇

三大特性-参考答案

 代码优化

如下示例, 在没有学习类这个概念时,数据与功能是分离的,请用面向对象的形式优化以下代码

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','存储过程的名字')
class ExecutionSQL:
    def __init__(self, host='127.0.0.1', port=3306, db='db1', charset='utf-8'):
        self.host = host
        self.port = port
        self.db = db
        self.charset = charset

    def connect(self):
        pass

    def execute(self, sql):
        pass

ec1 = ExecutionSQL()
ec2 = ExecutionSQL()
ec3 = ExecutionSQL()
ec1.connect()
ec2.connect()
ec3.connect()
ec1.execute('select * from tb1;')
ec2.execute('select * from tb2;')
ec3.execute('select * from tb3;')

代码解释

不运行程序看代码说出代码运行结果并解释

class Parent(object):
    x = 1

class Child1(Parent):
    pass

class Child2(Parent):
    pass

print(Parent.x, Child1.x, Child2.x)
Child1.x = 2
print(Parent.x, Child1.x, Child2.x)
Parent.x = 3
print(Parent.x, Child1.x, Child2.x)

程序设计

使用组合与继承设计一个学生选择课程的程序,使老师和学生初始化都具有课程属性,但是属性值为空,可以动态添加,可打印出老师教授的的课程和学生学习的课程,可以打印出课程名字和价格,尽量避免写重复代码(提示:学生和老师都是属于人,都有课程属性)

"""
使用组合与继承设计一个学生选择课程的程序,
使老师和学生初始化都具有课程属性,但是属性值为空,可以动态添加,
可打印出老师教授的的课程和学生学习的课程,
可以打印出课程名字和价格,
尽量避免写重复代码(提示:学生和老师都是属于人,都有课程属性)
"""

class DeepsharePeople:
    school = 'deepshare'

    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex

class DeepshareTeacher(DeepsharePeople):
    def __init__(self, name, age, sex, level, salary):
        super().__init__(name, age, sex)
        self.level = level
        self.salary = salary

        self.courses = []

    def change_score(self):
        print('teacher %s is changing score' % self.name)

    def tell_course_info(self):
        print(('老师%s 教授的课程信息如下' % self.name).center(50, '='))
        for course_obj in self.courses:
            course_obj.info()

class DeepshareStudent(DeepsharePeople):
    def __init__(self, name, age, sex):
        super().__init__(name, age, sex, )
        self.courses = []

    def choose(self):
        print('student %s choose course' % self.name)

    def tell_course_info(self):
        print(('学生%s 学习的课程信息如下' % self.name).center(50, '='))
        for course_obj in self.courses:
            course_obj.info()

class Course:
    def __init__(self, cname, period, price):
        self.cname = cname
        self.period = period
        self.price = price

    def info(self):
        print('课程信息<名字:%s 周期:%s  价钱:%s>' % (self.cname, self.period, self.price))

tea1 = DeepshareTeacher('Albert', 18, 'male', 9, 3.1)
stu1 = DeepshareStudent('张三', 16, 'male')

python = Course('Python', '2mons', 1000)
database = Course('database', '3mons', 2000)
AI = Course('AI', '8mons', 3000)

# 给老师添加课程
tea1.courses.append(python)
tea1.courses.append(database)

tea1.courses[0].info()
for course_obj in tea1.courses:
    course_obj.info()

tea1.tell_course_info()

# 给学生添加课程
stu1.courses.append(python)
stu1.courses.append(AI)
stu1.courses.append(database)
stu1.tell_course_info()

使用多肽与封装设计一个虚拟宠物的程序,

三个基础的宠物类 -- Cat类,Dog类,Pig类
属性:name(名字)、type(品种),name、type均为私有属性(对内可见,对外不可见)
type属性为成员属性(由构造器__init__方法赋初值),
但type对外又是可读可写(利用property装饰器实现),
name属性初始化操作由父类完成(子类利用super()来实现)
方法:eat(self)
	均拥有eat的方法(父级继承)
	但实现体分别可以体现出 "吃猫粮"、"吃狗粮"、"吃猪粮"不同点(不同的实现)

一个宠物的父类 -- Pet类
	属性:name(名字)
		name为私有属性(对内可见,对外不可见)
		name属性为成员属性(由构造器__init__方法赋初值)
		但name对外又是可读可写(利用property装饰器实现)
	方法:eat(self)
		拥有eat的方法(没有方法的实现体,利用abc模块实现)

一个主人类 -- Master类
	属性:name(名字)、pet(宠物)
		name、pet均为私有成员属性(具体操作同上面属性的操作)
	方法:feed(self)
		拥有feed方法(方法只有self一个参数,没有多余的参数)
		feed方法实现要求
			-- "某某"主人准备好宠物粮食
			-- "某某品种"的"某某宠物"来进食
			-- 吃...(调用宠物自身的eat方法)
			注:""括起来的某某都是要被替换为具体的数据的

1.创建三个宠物主人,分别养的是不同的三种宠物
2.三个主人进行喂食的时候,对应养的宠物就会完成进食
其他细节自由补充
"""
三个基础的宠物类 -- Cat类,Dog类,Pig类
属性:name(名字)、type(品种),name、type均为私有属性(对内可见,对外不可见)
type属性为成员属性(由构造器__init__方法赋初值),
但type对外又是可读可写(利用property装饰器实现),
name属性初始化操作由父类完成(子类利用super()来实现)
方法:eat(self)
  均拥有eat的方法(父级继承)
  但实现体分别可以体现出 "吃猫粮"、"吃狗粮"、"吃猪粮"不同点(不同的实现)

一个宠物的父类 -- Pet类
  属性:name(名字)
    name为私有属性(对内可见,对外不可见)
    name属性为成员属性(由构造器__init__方法赋初值)
    但name对外又是可读可写(利用property装饰器实现)
  方法:eat(self)
    拥有eat的方法(没有方法的实现体,利用abc模块实现)

一个主人类 -- Master类
  属性:name(名字)、pet(宠物)
    name、pet均为私有成员属性(具体操作同上面属性的操作)
  方法:feed(self)
    拥有feed方法(方法只有self一个参数,没有多余的参数)
    feed方法实现要求
      -- "某某"主人准备好宠物粮食
      -- "某某品种"的"某某宠物"来进食
      -- 吃...(调用宠物自身的eat方法)
      注:""括起来的某某都是要被替换为具体的数据的

1.创建三个宠物主人,分别养的是不同的三种宠物
2.三个主人进行喂食的时候,对应养的宠物就会完成进食
其他细节自由补充
"""
import abc

class Master:

    def __init__(self, name, pet):
        self.__name = name
        self.__pet = pet

    def feed(self):
        print('%s 准备好宠物粮食' % self.__name)
        print('[%s] %s 来进食' % (self.__pet.pet_type, self.__pet.name))  # 某某品种的某某宠物
        self.__pet.eat()

class Pet(metaclass=abc.ABCMeta):

    def __init__(self, name):
        self.__name = name

    @abc.abstractmethod
    def eat(self):
        pass

    @property
    def name(self):
        return self.__name

    @name.setter
    def name(self, new_name):
        self.__name = new_name

class Cat(Pet):
    def __init__(self, name, cat_type):
        super().__init__(name)
        self.__type = cat_type

    @property
    def pet_type(self):
        return self.__type

    def eat(self):
        print('喵喵吃')

class Dog(Pet):
    def __init__(self, name, dog_type):
        super().__init__(name)
        self.__type = dog_type

    @property
    def pet_type(self):
        return self.__type

    def eat(self):
        print('汪汪吃')

class Pig(Pet):
    def __init__(self, name, pig_type):
        super().__init__(name)
        self.__type = pig_type

    @property
    def pet_type(self):
        return self.__type

    def eat(self):
        print('哼哼吃')

cat1 = Cat('大橘', '加菲猫')
dog1 = Dog('旺财', '巨贵')
pig1 = Pig('小黑', '荷兰猪')

m1 = Master('嫦娥', pig1)
m2 = Master('二郎神', dog1)
m3 = Master('Albert', cat1)
m1.feed()
m2.feed()
m3.feed()