zoukankan      html  css  js  c++  java
  • python学习(二十九)类方法连接数据库及面向对象编程(2)

    1、类方法连接数据库

    先说一下析构函数

     def __del__(self):
        pass

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

    import pymysql
    class Mydb(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 自动提交,写语句的时候自动提交
            except Exception as e:
                print('数据库连接失败!%s'%e)
            else:
                self.cur=self.coon.cursor(cursor=pymysql.cursors.DictCursor)
    
        def exsql(self,sql):
            try:
                self.cur.execute(sql)
            except Exception as e:
                print('sql语句有问题,%s'%sql)
            else:
                self.res=self.cur.fetchall()
                return self.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与实例对象的内存地址是一样的

    class Baby():
        def __init__(self,name):
            print('self的内存地址',id(self))
    dcg=Baby('测试')
    print('测试的内存地址',id(dcg))

    输出结果为:

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

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

    class Baby():
        country ='China'  #类变量,公共的变量,每个实例都可以用
        def my(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)类方法

    class Baby():
        country ='China'  #类变量,公共的变量,每个实例都可以用
        @classmethod
        def xm(cls):#cls代表的就是Baby,类方法
            print(cls.country)
            print('我是类方法')

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

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

    输出结果为:

    China
    我是类方法

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

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

    输出也是一样的

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

    class Baby():
        country ='China'  #类变量,公共的变量,每个实例都可以用
        def my(self):
            self.name='liujia'
        def cry(self):
            print('hhh')
        @classmethod
        def xm(cls):#cls代表的就是Baby,类方法
            print(cls.country)
            print('我是类方法')
            cls.name    #调用不了实例变量
            cls.cry()#调用不了实例方法
    
    
    Baby.xm()  

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

    3)静态方法

    class Baby():
        @staticmethod     #静态方法
         def xh():
                print('这是静态方法,它和一个没写在类里面的函数一样')

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

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

    class Baby():
        country ='China'  #类变量,公共的变量,每个实例都可以用
        def my(self):
            self.name='liujia'
        def cry(self):
            print('hhh')
         @staticmethod     #静态方法
        def xh():
            print('这是静态方法,它和一个没写在类里面的函数一样')
            self.name
            self.cry()

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

     

  • 相关阅读:
    Android MVP框架实现过程
    bga-banner-引导页滑动第三方控件
    好的习惯是成功的一半之开发
    Java基础复习之String字符串format处理
    ButterKnife--View注入框架的使用
    div阴影
    JavaScript函数的4种调用方法详解
    JavaScript的三种对话框是通过调用window对象的三个方法alert(),confirm()和prompt()
    HTML文字闪烁
    HTML文本框样式大全
  • 原文地址:https://www.cnblogs.com/emilyliu/p/9096682.html
Copyright © 2011-2022 走看看