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()但是会报错的

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

时间: 2024-10-04 01:15:04

python学习(二十九)类方法连接数据库及面向对象编程(2)的相关文章

笨办法学Python(二十九)

习题 29: 如果(if) 下面是你要写的作业,这段向你介绍了"if语句".把这段输入进去,让它能正确执行.然后我们看看你是否有所收获. 1 people = 20 2 cats = 30 3 dogs = 15 4 5 6 if people < cats: 7 print "Too many cats! The world is doomed!" 8 9 if people > cats: 10 print "Not many cats!

python 学习二十五天(python内置模块之序列化模块)

今日主要内容 1.python内置模块-序列化模块 python中的序列化模块 json 所有的编程语言都通用的序列化格式....它支持的数据类型非常有限 数字 字符串 列表 字典 pickle 只能在python语言的程序之间传递数据用的..pickle支持python中所有的数据类型 shelve python3.* 之后才有的 2.摘要模块---hashlib 3.一道经典面试题 第一.python内置模块---序列化 ***所有的导入模块都需要把import放在文件首位 什么叫序列化 能

python 学习笔记十九 django项目bbs论坛

跨站请求伪造保护 CSRF 中间件和模板标签提供对跨站请求伪造简单易用的防护.某些恶意网站上包含链接.表单按钮或者JavaScript ,它们会利用登录过的用户在浏览器中的认证信息试图在你的网站上完成某些操作,这就是跨站攻击.还有另外一种相关的攻击叫做“登录CSRF”,攻击站点触发用户浏览器用其它人的认证信息登录到其它站点. 全局: 中间件 django.middleware.csrf.CsrfViewMiddleware 局部: @csrf_protect,为当前函数强制设置防跨站请求伪造功能

Python(二十九)

一 IO模型 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non-blocking IO是一个东西.这其实是因为不同的人的知识背景不同,并且在讨论这个问题的时候上下文(context)也不相同.所以,为了更好的回答这个问题,先限定一下本文的上下文.本文讨论的背景是Linux

学习二十九

七周三次课(3月21日)10.11 Linux网络相关10.12 firewalld和netfilter10.13 netfilter5表5链介绍10.14 iptables语法 扩展(selinux了解即可) selinux教程 http://os.51cto.com/art/201209/355490.htm 2.selinux pdf电子书 http://pan.baidu.com/s/1jGGdExK Linux网络相关firewalld和netfilternetfilter5表5链介绍

Python学习日记(十九) 模块导入

模块导入 当文件夹中有这样一个自定义的command模块 在它的内部写下下列代码: print('这个py文件被调用!') def fuc(): print('这个函数被调用!') 然后我们在command模块中执行下列代码: import command #这个py文件被调用! 我们如果在这段程序中反复执行多次这一段代码,这一个文件结果也只会被导入一次 import command #这个py文件被调用! import command import command import command

Android学习笔记二十九之SwipeRefreshLayout、RecyclerView和CardView

Android学习笔记二十九之SwipeRefreshLayout.RecyclerView和CardView 前面我们介绍了AlertDialog和几个常用的Dialog,ProgressDialog进度条提示框.DatePickerDialog日期选择对话框和TimePickerDialog时间选择对话框.这一节我们介绍几个新的API控件SwipeRefreshLayout.RecyclerView和CardView,这几个API控件都是google在Android5.0推出的.下面我们来学

【Unity 3D】学习笔记二十九:游戏实例——简单小地图制作

任何的学习,光看不练是学不好的.所以这次就总结回顾下怎么制作MMROPG类游戏中的小地图.在MMROPG类游戏里,主角在游戏世界里走动时,一般在屏幕右上角都会有一个区域来显示当前游戏场景的小地图.主角在游戏世界里走动,小地图里代表着主角的小标记也会随之移动.那怎么实现咧? 首先需要确定两个贴图,第一个是右上角的小地图背景贴图,应该是从Y轴俯视向下截取主角所在的位置大地图.第二个就是主角的位置大贴图.在本例中,因为没有学习unity地图制作,所以地图用一个面对象代替,主角用立方体代替,使用GUI来

winform学习日志(二十九)----------根据标点符号分行,StringBuilder的使用;将字符串的每个字符颠倒输出,Reverse的使用

一:根据标点符号分行,上图,代码很简单 二:代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace Lines { public partial class Fr