# encoding='utf8'# auth:yanxiatingyu#2018.7.24

import pymysql

__all__ = ['Mymysql']

class MyExcept(Exception):    '''    常见做法定义异常基类,然后在派生不同类型的异常    '''

    def __init__(self, *args):        self.args = args

class DropDataaseError(MyExcept):    def __init__(self):        self.args = ('删除数据库错误!',)        self.message = '删除数据库错误!'        self.code = 100

class DropTableError(MyExcept):    def __init__(self):        self.args = ('删除表错误!',)        self.message = '删除表错误!'        self.code = 200

class CreateDatabaseError(MyExcept):    def __init__(self):        self.args = ('不能创建数据库',)        self.message = '不能创建数据库'        self.code = 300

class OperatorError(MyExcept):    '''    操作错误,一般是要做的事情和实际功能不匹配    '''

    def __init__(self, message):        self.args = (message,)        self.message = message        self.code = 400

class FileIsExistsError(MyExcept):    def __init__(self, message):        self.args = (message,)        self.message = message        self.code = 500

class Mymysql:    host = None    port = None    user = None    passpwd = None    database = None    charset = None

    conn = None    cursor = None

    @classmethod    def config(cls, db, host='localhost', port=3306, user='root', pwd='',               charset='utf8'):        cls.host = host        cls.port = port        cls.user = user        cls.passpwd = pwd        cls.database = db        cls.charset = charset        cls.__init_connect()        cls.__new_course()

    @classmethod    def __init_connect(cls):        cls.conn = pymysql.connect(            host=cls.host,            port=cls.port,            user=cls.user,            password=cls.passpwd,            database=cls.database,            charset=cls.charset        )

    @classmethod    def __new_course(cls):        cls.cursor = cls.conn.cursor()

    ## userinfo=[    #     (3,"alex"),    #     (4,"lxx"),    #     (5,"yxx")    #    # sql='insert into student values(%s,%s,%s);'    # cursor.executemany(sql,userinfo)    @classmethod    def filter(cls, sql):        '''        过滤sql语句        :param sql:        :return: 返回过滤后的sql语句        '''

        return sql.lower()

    # @multimethod    # def __query(cls, sql):    #     msg = 0    #     try:    #         msg = cls.cursor.execute(cls.filter(sql))    #         cls.conn.commit()    #     except Exception as e:    #         cls.conn.rollback()    #     finally:    #         return msg

    @classmethod    def __query(cls, sql,*args):        '''        底层查询        :param sql:        :param args:        :return: rows 操作成功返回受影响的行数        '''        rows = 0        try:            rows = cls.cursor.execute(cls.filter(sql), *args)            cls.conn.commit()        except Exception as e:            cls.conn.rollback()        finally:            return rows

    @classmethod    def insert(cls, sql, args):        if not ('insert into' in sql.lower()):            raise OperatorError('这是插入操作!')        return cls.__query(sql, args)

    @classmethod    def update(cls, sql):  # update test set name='你好'  where name='egon';        if not ('update' in sql.lower()):            raise OperatorError('这是更新操作')        return cls.__query(sql)

    @classmethod    def drop(cls, sql):

        if not ('drop' in sql.lower()):  # drop table test;            raise OperatorError('无法提供非drop table类的方法')

        if not ('drop database' in sql):            raise OperatorError('无法删除数据库!')

        return cls.__query(sql)

    @classmethod    def delete(cls, sql):        if not ('delete ' in sql.lower()):            raise OperatorError('无法提供非delete 记录操作!')        return cls.__query(sql)

    # 记录级别    # alter table test add age int;    # alter table test modify name char(15);    # alter table test change  NAME char(15);#    # alter table test drop age;    @classmethod    def alter(cls, sql):        if not ('alter' in sql.lower()):            raise OperatorError('只能提供修改操作')

        if not ('alter database' in sql):            raise OperatorError('操作错误你大爷')

        return cls.__query(cls)

    @classmethod    def create(cls, sql):        if not ('create database' in sql.lower()):            raise OperatorError('不准创库操作')

        if not ('create table' in sql):            raise OperatorError('操作错误')

        return cls.__query(sql)

    @classmethod    def truncate(cls, table_name):        table_name = table_name.strip()        if not isinstance(table_name, str):            raise TypeError('类型错误')        return cls.__query('truncate %s;' % table_name)

    # update test set name='lxx_dsb' where id=2;    # update yanxiatingyu  set name='lxx_dsb' where name='lxx';    @classmethod    def update(cls, sql):        if not ('update' in sql):            raise TypeError('只能更新')        return cls.__query(sql)

    @classmethod    def select(cls, sql):        if not ('select' in sql.lower()):            raise OperatorError('操作错误')        return cls.__query(sql)

    @classmethod    def get_line(cls, sql):        '''        获取单行的数据        :return:        '''        if not ('select' in sql):            raise OperatorError('执行查询')

        cls.__query(sql)

        try:            return True, cls.cursor.fetchone()        except:            return False, '没有数据'

    @classmethod    def get_lines(cls, sql):        '''        返回多行数据        :return:        '''        sql = sql.lower()

        if not ('select' in sql):            raise OperatorError('执行查询')        # print(sql.lower())        cls.__query(sql)        try:            return True, cls.cursor.fetchall()        except Exception as e:            print(e)            return False, '没有数据'

    @classmethod    def get_fetchmany(cls, sql, size=1):        '''        获取指定数量数据        :param size: 接收size条返回结果行.如果size的值大于返回的结果行的数量,则会返回cursor.arraysize条数        :return:tuple        '''        if not isinstance(size, int):            raise TypeError('类型错误')

        if size <= 0:            return None

        sql = sql.lower()        if not ('select' in sql):            raise OperatorError('执行查询')

        cls.__query(sql)

        return cls.cursor.fechmany(size)

    @classmethod    def close(cls):        '''        关闭cursor 和db 连接        :return:        '''        cls.cursor.close()        cls.conn.close()

Mymysql.config(db='db1')res = Mymysql.get_lines('select * from student;')print(res)

#config 
if mode:    if not os.path.exists(path):        raise FileIsExistsError('文件不存在')

    with open(path, 'rt', encoding='utf8') as f:        config_json_dic = json.load(f)

    cls.host = config_json_dic['host']    cls.port = config_json_dic['port']    cls.user = config_json_dic['user']    cls.passwd = config_json_dic['passwd']    cls.charset = config_json_dic['charset']

python 不需要函数重载

 

函数重载主要是为了解决两个问题。

  1. 可变参数类型。
  2. 可变参数个数。

另外,一个基本的设计原则是,仅仅当两个函数除了参数类型和参数个数不同以外,其功能是完全相同的,此时才使用函数重载,如果两个函数的功能其实不同,那么不应当使用重载,而应当使用一个名字不同的函数。

好吧,那么对于情况 1 ,函数功能相同,但是参数类型不同,python 如何处理?答案是根本不需要处理,因为 python 可以接受任何类型的参数,如果函数的功能相同,那么不同的参数类型在 python 中很可能是相同的代码,没有必要做成两个不同函数。

那么对于情况 2 ,函数功能相同,但参数个数不同,python 如何处理?大家知道,答案就是缺省参数。对那些缺少的参数设定为缺省参数即可解决问题。因为你假设函数功能相同,那么那些缺少的参数终归是需要用的。

好了,鉴于情况 1 跟 情况 2 都有了解决方案,python 自然就不需要函数重载了。

I'm learning Python (3.x) from a Java background.

I have a python program where I create a personObject and add it to a list.

p = Person("John")
list.addPerson(p)

But for flexibility I also want to be able to declare it directly in the addPerson method, like so:

list.addPerson("John")

The addPerson method will be able to differentiate whether or not I'm sending a Person-object or a String.

In Java I would create two separate methods, like this:

void addPerson(Person p) {
    //Add person to list
}

void addPerson(String personName) {
    //Create Person object
    //Add person to list
}

I'm not able to find out how to do this in Python. I know of a type() function, which I could use to check whether or not the parameter is a String or an Object. However, that seems messy to me. Is there another way of doing it?

EDIT:

I guess the alternative workaround would be something like this(python):

def addPerson(self, person):
    //check if person is string
        //Create person object

    //Check that person is a Person instance
        //Do nothing

    //Add person to list

But it seems messy compared to the overloading solution in Java.

解决方案

Using the reference pointed by @Kevin you can do something like:

from multimethod import multimethod

class Person(object):
    def __init__(self, myname):
        self.name = myname

    def __str__(self):
        return self.name

    def __repr__(self):
        return self.__str__()

@multimethod(list, object)
def addPerson(l, p):
    l = l +[p]
    return l

@multimethod(list, str)
def addPerson(l, name):
    p = Person(name)
    l = l +[p]
    return l

alist = []
alist = addPerson(alist, Person("foo"))
alist = addPerson(alist, "bar")
print(alist)

The result will be:

$ python test.py
[foo, bar]

(you need to install multimethod first)

http://www.it1352.com/779685.html

python pyMysql 自定义异常 函数重载的更多相关文章

  1. 【ZH奶酪】为什么Python不需要函数重载?

    函数重载的作用是什么? 函数重载主要是为了解决两个问题 可变参数类型 可变参数个数 另外,一个基本的设计原则是,仅仅当两个函数除了参数类型和参数个数不同以外,其功能是完全相同的,此时才使用函数重载,如 ...

  2. Python不支持函数重载

    函数重载与Python: 函数重载的好处就是不用为了不同的参数类型或参数个数,而写多个函数.多个函数用同一个名字,但参数表,即参数的个数和数据类型可以不同.调用的时候,虽然方法名字相同,但根据参数表可 ...

  3. python 不需要函数重载

    函数重载主要是为了解决两个问题. 可变参数类型. 可变参数个数. 另外,一个基本的设计原则是,仅仅当两个函数除了参数类型和参数个数不同以外,其功能是完全相同的,此时才使用函数重载,如果两个函数的功能其 ...

  4. Python(十三)python的函数重载

    首先,重载函数的功能是实现参数不同情况下功能相同的函数. 函数重载的目的是解决功能相同的函数的以下问题: 1.参数的类型: 2.参数的个数: 对于情况1,函数功能呢相同,参数不同的情况. python ...

  5. 为什么 Python 没有函数重载?如何用装饰器实现函数重载?

    英文:https://arpitbhayani.me/blogs/function-overloading 作者:arprit 译者:豌豆花下猫("Python猫"公众号作者) 声 ...

  6. python中函数重载和重写

    python 中的重载  在python中,具有重载的思想却没有重载的概念.所以有的人说python这么语言并不支持函数重载,有的人说python具有重载功能.实际上python编程中具有重载的目的缺 ...

  7. python中类的设计问题(一些高级问题探讨,函数重载,伪私有,工厂模式,类方法等)

    从这里再次体现了python语言强大的灵活性.某些在高级语言中看似不严谨需要尽量避免的地方在python中都是允许的. 比如: (1),异常可以用来处理错误 (2),方法,类也都可以视为对象. (3) ...

  8. python中不需要函数重载的原因

    函数重载主要是为了解决两个问题: 1.可变参数类型 2.可变参数个数 并且函数重载一个基本的设计原则是,仅仅当两个函数除了参数类型和参数个数不同以外,其功能是完全相同的,此时才使用函数重载,如果两个函 ...

  9. Python中的操作符重载

    运算符重载是指在方法中拦截内置的操作----当类的实例出现在内置操作中,Python会自动调用自定义的办法,并且返回自定义方法的操作结果.     类可以重载python的操作符 操作符重载使我们的对 ...

随机推荐

  1. vmware搭建lnmp环境配置域名

    找到nginx配置文件,修改server_name 然后找到/etc/hosts文件 修改成如下 之后在Windows本地的C盘的hosts文件中添加解析 好了,这样就可以访问了 通往牛逼的路上,在意 ...

  2. shell-保留文件系统下剩余指定数目的文件

       path_backup=/mnt/fifth/backup/shellbackup  path_delete=/mnt/fifth/tmp/rubbish/  limit_num=15    f ...

  3. Django中使用mysql数据库并使用原生sql语句操作

    Django自身默认使用sqlite3这个轻量级的数据库,但是当我们开发网站时,sqlite3就没有mysql好,sqlite3适合一些手机上开发使用的数据库. 准备的软件mysql数据库,版本5.7 ...

  4. webpack相关配置

    cd 项目文件夹 npm init -y npm install jquery -S //生成node_modules 下载好jquery 创建webpack.config.js module.exp ...

  5. linux下进程查找和杀死

    比如杀死进程中叫  abc的进程 1.ps -ef |grep abc|awk '{print $2}' xargs kill -9 2.kill `pidof abc`        `位于tab键 ...

  6. Java:类加载机制及反射

    一.Java类加载机制 1.概述 Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允 ...

  7. spring 事务传播

    1.spring实现对事务的控制,使用的是代理的技术.通过生成的代理类来捕捉被代理类(也就是我们编写的类)的异常,决定事务的提交或回滚.从某一角度来说,spring事务是基于异常实现的.对于实现了接口 ...

  8. Ext.require 的作用(转)

    Ext.require:用到哪些组件,然后就预先加载,多余不用加载的组件 在实际环境中我们都会用 ext-all.js, 但是在开发调试的时候,我们使用 require 的话它可以动态加载单个的 js ...

  9. c3p0的几种使用方式(原文地址: https://my.oschina.net/liangtee/blog/101047)

    package com.c3p0.test; import java.sql.Connection; import java.sql.SQLException; import java.beans.P ...

  10. 激活 pycharm

    step1: 在本地 hosts 文件增加一行,windows 路径一般为:C:\Windows\System32\drivers\etc step2: 输入激活码 7SPIY8PDT7-eyJsaW ...