笔记-python-__new__()
笔记-python-__new__()
1. __new__()
__new__() 是在新式类中新出现的方法,它作用在构造方法建造实例之前.
验证代码:
class Person(object):
def __new__(cls, name, age):
print('__new__ called.')
instance = super(Person, cls).__new__(cls)
return instance
def __init__(self, name,age):
print('__init__ called.')
self.name = name
self.age = age
def __str__(self):
return '<Person:%s(%s)' %(self.name, self.age)
name = Person('xxx', 45)
print(name)
输出:
__new__ called.
__init__ called.
<Person:xxx(45)
可以发现new是在init之前调用的,对于整个实例化过程可以这样理解:
- name = Person(‘xxx’,45)
- 首先执行new方法,返回一个Personal类的一个实例;
- 利用实例调用init方法,初始化实例。
1.1. __new__()使用
一般情况下不需要做如此细颗粒度的操作,但在一些需要操纵类实例化细节的时候,就需要使用__new__了。
典型的场景时单例模式实现:
# singleton __new__()
class Singleton(object):
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls._instance
class Myclass(Singleton):
a = 1
a1 = Myclass()
a2 = Myclass()
print(a1 == a2, a1 is a2)
重载new,在类实例化时通过new进行判断,返回已有类或生成新类。
1.2. 附加内容
new只能用于从object继承的新式类。
object中对new方法的定义如下:
class object:
@staticmethod # known case of __new__
def __new__(cls, *more): # known special case of object.__new__
""" T.__new__(S, ...) -> a new object with type S, a subtype of T """
pass
1.3. 问题
class Person(object):
def __new__(cls, name, age):
print('__new__ called.')
instance = super(Person, cls).__new__(cls,name,age)
return instance
def __init__(self, name,age):
print('__init__ called.')
self.name = name
self.age = age
def __str__(self):
return '<Person:%s(%s)' %(self.name, self.age)
name = Person('xxx', 45)
print(name)
使用后报错:TypeError: object() takes no parameters
笔记-python-__new__()的更多相关文章
- MongoDB学习笔记:Python 操作MongoDB
MongoDB学习笔记:Python 操作MongoDB Pymongo 安装 安装pymongopip install pymongoPyMongo是驱动程序,使python程序能够使用Mong ...
- python __new__以及__init__
@[深入Python]__new__和__init__ 1 2 3 4 5 6 7 8 class A(object): def __init__(self): print & ...
- 笔记-python操作mysql
笔记-python操作mysql 1. 开始 1.1. 环境准备-mysql create database db_python; use db_python; create tabl ...
- 笔记-python异常信息输出
笔记-python异常信息输出 1. 异常信息输出 python异常捕获使用try-except-else-finally语句: 在except 语句中可以使用except as e,然后通 ...
- 笔记-python -asynio
笔记-python -asynio 1. 简介 asyncio是做什么的? asyncio is a library to write concurrent code using the a ...
- 笔记-python lib-pymongo
笔记-python lib-pymongo 1. 开始 pymongo是python版的连接库,最新版为3.7.2. 文档地址:https://pypi.org/project/pymong ...
- 笔记-python tutorial-9.classes
笔记-python tutorial-9.classes 1. Classes 1.1. scopes and namespaces namespace: A namespace is ...
- 机器学习实战笔记(Python实现)-08-线性回归
--------------------------------------------------------------------------------------- 本系列文章为<机器 ...
- 机器学习实战笔记(Python实现)-05-支持向量机(SVM)
--------------------------------------------------------------------------------------- 本系列文章为<机器 ...
- 机器学习实战笔记(Python实现)-04-Logistic回归
--------------------------------------------------------------------------------------- 本系列文章为<机器 ...
随机推荐
- 19.CentOS7下PostgreSQL安装过程
CentOS7下PostgreSQL安装过程 装包 sudo yum install postgresql-server postgresql-contrib 说明: 这种方式直接明了,其他方法也可以 ...
- JS常用公共方法封装
_ooOoo_ o8888888o 88" . "88 (| -_- |) O\ = /O ____/`---'\____ .' \\| |// `. / \\||| : |||/ ...
- BZOJ3798: 特殊的质数(分段打表)
题意 题目链接 Sol 分块打表,非常好的思想. 对于这种求$[A, B]$区间内xxx的数的个数,然后$B$又不算是特别大的题,考虑分段打表 每个块的大小为$10^5$,打$3 * 10^3$个.然 ...
- 构建第一个Spring Boot2.0应用之RequestMapping(四)
在学习controller的时候,测试了在RequestMapping中,value参数中配置集合,实现不同的URL访问同一方法. 本章继续学习和测试RequestMapping的其他特性. 一.Pa ...
- UVA 11990 ``Dynamic'' Inversion (线段树套BIT,分治)
题目要求可转化为查询一个区间内有多少数比val大(或者小). 区间用线段树分解(logN),每个区间维护一rank树. rank可用BIT查询,往BIT里面插值,为了保证不同区间的BIT互不影响要先离 ...
- swift 命名空间实现的设计思考:extension YKKit where Base == String
设计问题:谁来构造.构造什么.怎么添加新功能 关键词:本体.客体.构造.映射.功能. 别名:桥接变量.型变变量.容器变量.适配变量,构造变量: 目的:添加命名空间.添加新功能. 原则:不修改本体的实现 ...
- 问题 M: 克隆玩具
题目描述 你只有一个A类型玩具,现在有个有两种功能的机器:1. 加工一个A类型的玩具能够再得到一个A类型的玩具和一个B类型的玩具.2. 加工一个B类型的玩具,能得到两个B类型的玩具. 问经过多次加工之 ...
- CYUSB
/*Summary The application cydesc is used to open the device with cypress GUID and get the device des ...
- ambari过程中要求各个节点时间同步
设置时间同步 控制节点机器 cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime #设置时区为北京时间,这里为上海,因为centos里面只有上海... ...
- java设计模式——单例模式(三)
容器单例模式 之前学习Structs2,Spring框架时,经常会听到单例,多例.虽然这与单例模式不太一样,但是都很类似.在程序运行的时候,就加载所有的实例,然后用的时候直接取出 看下面代码: /** ...