python通过什么对象连接数据库_python学习(二十九)类方法连接数据库及面向对象编程(2)...

1、类方法连接数据库

先说一下析构函数

def __del__(self):pass

析构函数,在实例被销毁的时候执行,那么对于连接数据库,在实例执行后,需要关闭游标和数据库连接,这两个操作就可以放到析构函数里面

importpymysqlclassMydb(object):def __del__(self): #析构函数,实例被销毁的时候执行的

self.cur.close()

self.coon.close()print(‘over‘)def __init__(self,host,user,passwd,db,

port=3306,charset=‘utf8‘):try:

self.coon=pymysql.connect(

host=host,user=user,passwd=passwd,port=port,

charset=charset,db=db,autocommit=True

)#autocommit 自动提交,写语句的时候自动提交

exceptException as e:print(‘数据库连接失败!%s‘%e)else:

self.cur=self.coon.cursor(cursor=pymysql.cursors.DictCursor)defexsql(self,sql):try:

self.cur.execute(sql)exceptException as e:print(‘sql语句有问题,%s‘%sql)else:

self.res=self.cur.fetchall()returnself.res

my=Mydb(‘xxx‘,‘jxz‘,‘123456‘,‘jxz‘)

my.exsql(‘select * from stu;‘)print(‘我是最后一行代码‘)

在构造函数里,进行数据库连接,并做异常处理,在执行sql语句函数中进行sql语句执行,析构函数中操作关闭游标和数据库连接。

在连接数据库的时候,有一个新的知识点:autocommit=True 自动提交,这个在以前写的数据库连接使用中并未提到,代替了之前需要判断是否是select语句,是否需要提交。

2、if __name__==‘__main__‘用法

if __name__==‘__main__‘:

一般在做测试或者调试的时候用

如果是直接运行这个python文件,这句话就没有什么用处

正常在python文件中导入其他python文件,且该python文件会正常执行

但是如果导入的python文件里有 if __name__==‘__main__‘: 这个执行结果,那么导入的这个python文件就不会执行

3、类变量,实例变量及实例方法

1)概念

类变量: 公共的变量,每个实例都可以用

实例变量:成员变量

实例方法:实例化后才能用

2)self

self代表的是本类对象,因为函数里面的变量都是局部变量,出了函数就不能用了,用self给对象绑定了之后,就可以self.xx随便用了

self与实例对象的内存地址是一样的

classBaby():def __init__(self,name):print(‘self的内存地址‘,id(self))

dcg=Baby(‘测试‘)print(‘测试的内存地址‘,id(dcg))

输出结果为:

self的内存地址 801098625712测试的内存地址801098625712

3)类变量,实例变量及实例方法使用

classBaby():

country=‘China‘ #类变量,公共的变量,每个实例都可以用

defmy(self):

self.name=‘liujia‘abc=Baby()print(abc.country) #使用类变量的值

Baby.country=‘USA‘ #类变量可以直接通过类名.xxx来进行修改

yjt=Baby()print(yjt.country) #类变量已经修改为USA

dcg=Baby()

dcg.country=‘Japan‘ #实例变量

print(dcg.country)

看以上这段代码,country变量是类下面,但没有在其他函数里面,是类变量,每个实例都可以用;

my()函数是一个实例方法,在实例化后才能使用;

先看实例化为abc后,打印country,那么使用的是类变量,输出为China;然后类变量进行了修改,这时候实例化为yjt,输出的country就是USA,最后实例化为

dcg,这个实例修改了country的值,最后输出的country就是Japan。

4)装饰器

4、类方法,静态方法

1)概念

类方法:

不用实例化就可以直接调用

可以通过cls使用类变量

不能调用实例方法

不想实例化的时候,可以定义成类方法

静态方法:

一个普通函数,只是写在类里面,用不了类变量,类方法,实例变量和实例方法

2)类方法

classBaby():

country=‘China‘ #类变量,公共的变量,每个实例都可以用

@classmethoddef xm(cls):#cls代表的就是Baby,类方法

print(cls.country)print(‘我是类方法‘)

类方法可以不用实例化,直接调用

Baby.xm() #不实例化,直接类名调用xm这个方法

输出结果为:

China

我是类方法

当然也可以先实例化,再调用

dcg=Baby()

dcg.xm()#实例化后,在通过实例化后的对象调用xm方法

输出也是一样的

还有一点是,类方法里面不能调用实例变量和实例方法,比如

classBaby():

country=‘China‘ #类变量,公共的变量,每个实例都可以用

defmy(self):

self.name=‘liujia‘

defcry(self):print(‘hhh‘)

@classmethoddef xm(cls):#cls代表的就是Baby,类方法

print(cls.country)print(‘我是类方法‘)

cls.name#调用不了实例变量

cls.cry()#调用不了实例方法

Baby.xm()

不管是cls.name,还是cls.cry(),但是会运行报错的

3)静态方法

classBaby():

@staticmethod#静态方法

defxh():print(‘这是静态方法,它和一个没写在类里面的函数一样‘)

可以注意到这个类里面的函数是没有self这个本类对象的,它就是一个普通的函数,但是也还是需要实例化后才能调用

并且调用实例变量,实例方法等都是不可以的

classBaby():

country=‘China‘ #类变量,公共的变量,每个实例都可以用

defmy(self):

self.name=‘liujia‘

defcry(self):print(‘hhh‘)

@staticmethod#静态方法

defxh():print(‘这是静态方法,它和一个没写在类里面的函数一样‘)

self.name

self.cry()

self.name和self.cry()但是会报错的

原文:https://www.cnblogs.com/emilyliu/p/9096682.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值