本节重点
总结面向对象的优点 本节长度应控制在10分钟内
面向对象的代码级别 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','utf存储过程程的名称
我们能想到的解决办法是将这些变量定义为全局变量
HOST=‘127.0.0.1’ PORT=3306 DB=‘db1’ CHARSET=‘utf8’ 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(HOST,PORT,DB,CHARSET,'select * from tb1;') exc2(HOST,PORT,DB,CHARSET,存储过程中的名称
3.然而,2的解决方案也存在问题。根据2的想法,我们将定义大量的全球变量。这些全球变量没有区别,即可以用于所有功能。然而,事实上,只有HOST,PORT,DB,CHARSET是给exc1和exc两个功能使用。言下之意:我们必须找到一种将数据与操作数据相结合的解决方案,这就是我们所说的
class MySQLHandler: def __init__(self,host,port,db,charset='utf8'): self.host=host self.port=port self.db=db self.charset=charset self.conn=connect(self.host,self.port,self.db,self.charset) def exc1(self,sql): return self.conn.execute(sql) def exc2(self,sql): return self.conn.call_proc(sql) obj=MySQLHandler('127.0.0.1',3306,'db1') obj.exc1('select * from tb1;') obj.exc(存储过程中的名称) 总结使用类可以: 将数据与专门操作数据的功能集成在一起。 可扩展性高 定义类并产生三个对象 class Chinese: def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex p1=Chinese('egon',18,'male') p2=Chinese('alex',38,'female') p3=Chinese('wpq',48,'female') 如果我们添加一个类属性,它将立即反映给所有对象,但对象不需要修改 class Chinese: country='China' def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex def tell_info(self): info=''' 国籍:%s 姓名:%s 年龄:%s 性别:%s ''' %(self.country,self.name,self.age,self.sex) print(info) p1=Chinese('egon',18,'male') p2=Chinese('alex',38,'female') p3=Chinese('wpq',48,'female') print(p1.country) p1.tell_info()