python基础编程Day15:三大特性

学习任务:https://zhuanlan.zhihu.com/p/52535231
练习:
一、代码优化

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

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 Example:
    def __init__(self,host,port,db,charset):
        self.host = host
        self.port = port
        self.db = db
        self.charset = charset

    def exc1(self,sql):
        conn = connect(self.host, self.port, self.db, self.charset)
        conn.execute(sql)
        return xxx

    def exc2(self, proc_name):
        conn = connect(self.host, self.port, self.db, self.charset)
        conn.call_proc(proc_name)
        return xxx

# 调用
do = Example('127.0.0.1', 3306, 'db1', 'utf8')
do.exc1('select * from tb1;')
do.exc2('存储过程的名字')

二、程序设计

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

class People:
    def __init__(self,name,id,lesson=[],tuition=[]):
        self.name = name
        self.id = id
        self.lesson = lesson
        self.tuition = tuition

    def addlesson(self, lesson, tuition):
        lessonlist = []
        tuitionlist = []
        lessonlist.append(lesson)
        tuitionlist.append(tuition)
        for l in lessonlist:
            for t in tuitionlist:
                print("""
                课程信息
                %s姓名:%s
                课程名称:%s
                课程价格:%s
                """ % (self.id,self.name,l,t))

class Teacher(People):
    pass

class Student(People):
    pass

tea1 = Teacher('Albert','老师')
tea1.addlesson('English',30)

stu1 = Student('Joy','学生')
stu1.addlesson('English',30)

运行结果:
在这里插入图片描述
第二题:

    """
    使用多肽与封装设计一个虚拟宠物的程序,具体要求如下:
    三个基础的宠物类 -- 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方法)
			注:""括起来的某某都是要被替换为具体的数据的

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

import abc
class Pet(metaclass=abc.ABCMeta):
    def __init__(self, name):
        self.__name = name

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

    @abc.abstractmethod
    def eat(self):
        pass

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

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

    @type.setter
    def type(self, x):
        print('修改'.center(50, '='))
        self.__type = x

    # @type.deleter
    # def type(self):
    #     print('删除'.center(50, '='))
    #     del self.__type

    def eat(self):
        print('%s正在吃猫粮' % self.name)


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

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

    @type.setter
    def type(self, x):
        print('修改'.center(50, '='))
        self.__type = x

    def eat(self):
        print('%s正在吃狗粮' % self.name)


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

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

    @type.setter
    def type(self, x):
        print('修改'.center(50, '='))
        self.__type = x

    def eat(self):
        print('%s正在吃猪粮' % self.name)


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

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

    @property
    def pet(self):
        return self.__pet

    def feed(self):
        pettype = self
        print('''
        %s主人准备好宠物粮食
        %s品种的%s来进食      
        ''' % (self.name,self.pet.type,self.pet.name))
        self.pet.eat()

pet1 = Pig('pipi','minipig')
master1 = Master('Anny',pet1)
master1.feed()

pet2 = Cat('nini','Siamese')
master2 = Master('Bob',pet2)
master2.feed()

pet3 = Dog('lala','Husky')
master3 = Master('Candy',pet3)
master3.feed()

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43697287/article/details/86560911
今日推荐