热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python中init和setup有什么区别_Python中的_init__和_new__的区别

使用python的面向对象写过程序之后,相信童鞋对__init__方法已经非常的熟悉了。这个方法通常是在初始化一个实例的时候使用的。例如:classMy

使用python 的面向对象写过程序之后,相信童鞋对 __init__ 方法已经非常的熟悉了。这个方法通常是 在初始化一个实例的时候使用的。

例如:

classMysqlConnector(object):'''Python与mysql的连接器'''

def __init__(self, host, port, username, password, db):

conn= pymysql.connect(host=host, port=port, user=username,

passwd=password, db=db, use_unicode=True, charset="utf8")

self.conn=conn

self.cursor= conn.cursor(cursor=pymysql.cursors.DictCursor)

# 实例化一个Python与Mysql的连接器:

if __name__ == '__main__':

conn = MysqlConnector('127.0.0.1', 3366, 'root', '123456', 'db1')

这便就是 __init__ 普通的用法了。但是 __init__ 并不是一个类,在实例化对象时第一个被调用的方法。

当 执行 MysqlConnector('127.0.0.1', 3366, 'root', '123456', 'db1')这句代码时,最先被执行的方法是 __new__。

__new__ 是什么鬼?:

__new__ 虽然接受的参数和  __init__ 是一样的(也可以不一样)。但是 __init__ 是在对象(类实例)被创建之后才执行的方法。而__new__方法,就是创建这个实例的方法。

看下面这个例子:

classBaseModel(object):'''实现将Python语句转换为sql语句,配合MysqlConnector实现表的创建以及数据的增删查改等操作。

创建表时: 支持主键PRIMARY KEY,索引INDEX,唯一索引UNIQUE,自增AUTO INCREMENT 外键语句

创建的表引擎指定为InnoDB,字符集为 utf-8

增删查改: 支持WHERE [LIKE] LIMIT语句

其子类必须设置initialize方法,并在该方法中创建字段对象'''

def __new__(cls, *args, **kwargs):

_instance= super().__new__(cls)

_instance.initialize()return_instancedef __init__(self, table_name, sql_connector):''':param table_name: 要建立的表名

:param sql_connector: MysqlConnector实例对象'''self.table_name=table_name

self.fields=[]

self.primary_key_field=None

self.uniques_fields=[]

self.index_fields=[]

self.is_foreign_key_fields=[]

self.sql_connector=sql_connector

self._create_fields_list()

self.create_table()

def initialize(self):

'''BaseModel的每个子类中必需包含该方法,且在该方法中定义字段'''

raise NotImplementedError("Method or function hasn't been implemented yet.")

在这个例子中不仅使用了 父类的 __new__ 方法。 并且还加上了自己想要的条件。 在继承基类的子类中,如果没有实现  initialize  方法的话,就会执行基类中的 initialize  方法然后就会抛出异常。

1.__init__ 通常用于初始化一个新实例,控制这个初始化的过程,比如添加一些属性, 做一些额外的操作,发生在类实例被创建完以后。它是实例级别的方法。

2.__new__ 通常用于控制生成一个新实例的过程。它是类级别的方法。

但是说了这么多,__new__最通常的用法是什么呢,我们什么时候需要__new__?

依照Python官方文档的说法,__new__方法主要是当你继承一些不可变的class时(比如int, str, tuple), 提供给你一个自定义这些类的实例化过程的途径。还有就是实现自定义的metaclass。

首先我们来看一下第一个功能,具体我们可以用int来作为一个例子:

假如我们需要一个永远都是正数的整数类型,通过集成int,我们可能会写出这样的代码。

但运行后会发现,结果根本不是我们想的那样,我们任然得到了-3。这是因为对于int这种 不可变的对象,我们只有重载它的__new__方法才能起到自定义的作用。

这是修改后的代码:

通过重载__new__方法,我们实现了需要的功能。

用__new__来实现单例

事实上,当我们理解了__new__方法后,我们还可以利用它来做一些其他有趣的事情,比如实现 设计模式中的 单例模式(singleton) 。

因为类每一次实例化后产生的过程都是通过__new__来控制的,所以通过重载__new__方法,我们 可以很简单的实现单例模式。

输出结果:

可以看到obj1和obj2是同一个实例。

自定义metaclass:

另外一个作用,关于自定义metaclass。其实我最早接触__new__的时候,就是因为需要自定义 metaclass,但鉴于篇幅原因,我们下次再来讲python中的metaclass和__new__的关系。



推荐阅读
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 本文介绍了如何使用Python的Paramiko库批量更新多台服务器的登录密码。通过示例代码展示了具体实现方法,确保了操作的高效性和安全性。Paramiko库提供了强大的SSH2协议支持,使得远程服务器管理变得更加便捷。此外,文章还详细说明了代码的各个部分,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 本文介绍如何在将数据库从服务器复制到本地时,处理因外键约束导致的数据插入失败问题。 ... [详细]
  • importpymysql#一、直接连接mysql数据库'''coonpymysql.connect(host'192.168.*.*',u ... [详细]
  • MySQL 5.7 学习指南:SQLyog 中的主键、列属性和数据类型
    本文介绍了 MySQL 5.7 中主键(Primary Key)和自增(Auto-Increment)的概念,以及如何在 SQLyog 中设置这些属性。同时,还探讨了数据类型的分类和选择,以及列属性的设置方法。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 本文将详细介绍Python中*args和**kwargs的用法,包括它们的基本概念、应用场景以及注意事项。 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • 属性类 `Properties` 是 `Hashtable` 类的子类,用于存储键值对形式的数据。该类在 Java 中广泛应用于配置文件的读取与写入,支持字符串类型的键和值。通过 `Properties` 类,开发者可以方便地进行配置信息的管理,确保应用程序的灵活性和可维护性。此外,`Properties` 类还提供了加载和保存属性文件的方法,使其在实际开发中具有较高的实用价值。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 在使用 Cacti 进行监控时,发现已运行的转码机未产生流量,导致 Cacti 监控界面显示该转码机处于宕机状态。进一步检查 Cacti 日志,发现数据库中存在 SQL 查询失败的问题,错误代码为 145。此问题可能是由于数据库表损坏或索引失效所致,建议对相关表进行修复操作以恢复监控功能。 ... [详细]
  • 在什么情况下MySQL的可重复读隔离级别会导致幻读现象? ... [详细]
author-avatar
lady张昕彤
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有