python的静态类如何实现

python中没有静态类这个概念。

只有静态函数和类函数的概念。

静态函数无法访问类的自身对象,属性,但是类函数可以访问自身对象和属性。

这两个东西都不需要实例化。

那么其实也已经可以有静态类的效果了。

一般来说,使用静态类,无非是需要保持全局统一,并且减少资源的申请和回收,对于一些需要大量重复调用的类来说,写成一个静态类可以大大提升程序速度,减少系统开销。

要注意python中的静态类的使用是我们自己搞出来的,官方并没有说有这个东西,其初始化方法不能使用python的类的初始化函数__init__(self)。需要直接写在类的内部。如下:

class Test(object):
    #直接在这里初始化
    name = 'hello'

    #类方法的定义方式
    @classmethod
    def ClassFun(cls):
        print(cls.name)
    #静态函数的定义方式
    @staticmethod
    def StaticFun():
        print('hello_s');


if __name__ == '__main__':
    Test.ClassFun()
    print(id(Test))
    Test.StaticFun()
    print(id(Test))

下面是一个在操作mysql数据库时的一个具体应用:

import MySQLdb

class sql_opeartor():
    db = MySQLdb.connect("localhost", "root", "123456", "blog", charset='utf8mb4')
    cur = db.cursor()

    @classmethod
    def execute(cls, sql):
        try:
            # 执行SQL语句
            cls.cur.execute(sql)
            # 向数据库提交
            cls.db.commit()
        except:
            # 发生错误时回滚
            cls.db.rollback()

    @classmethod
    def query(cls, sql):
        try:
            # 执行SQL语句
            cls.cur.execute(sql)
            # 向数据库提交
            cls.db.commit()
        except:
            # 发生错误时回滚
            cls.db.rollback()
        results_tuple = cls.cur.fetchall()
        results_list = []
        for result in results_tuple:
            ans = []
            for item in result:
                ans.append(item)
            results_list.append(ans)
        return results_list

    @classmethod
    def create_table(cls, table_data=''):
        sql = "create table {0};".format(table_data)
        cls.execute(sql)

    @classmethod
    def delete_table(cls, table_name=''):
        sql = 'delete from {0}'.format(table_name)
        cls.execute(sql)

    @classmethod
    def drop_table(cls, table_name):
        sql = 'drop table {0}'.format(table_name)
        cls.execute(sql)

    @classmethod
    def show_table(cls, table_name=''):
        sql = 'select * from {0}'.format(table_name)
        cls.execute(sql)


if __name__ == '__main__':
    data = sql_opeartor.query('show tables;')
    print(data)
文章目录