笔记-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之前调用的,对于整个实例化过程可以这样理解:

  1. name = Person(‘xxx’,45)
  2. 首先执行new方法,返回一个Personal类的一个实例;
  3. 利用实例调用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__()的更多相关文章

  1. MongoDB学习笔记:Python 操作MongoDB

    MongoDB学习笔记:Python 操作MongoDB   Pymongo 安装 安装pymongopip install pymongoPyMongo是驱动程序,使python程序能够使用Mong ...

  2. python __new__以及__init__

    @[深入Python]__new__和__init__ 1 2 3 4 5 6 7 8 class A(object):     def __init__(self):         print & ...

  3. 笔记-python操作mysql

    笔记-python操作mysql 1.      开始 1.1.    环境准备-mysql create database db_python; use db_python; create tabl ...

  4. 笔记-python异常信息输出

    笔记-python异常信息输出 1.      异常信息输出 python异常捕获使用try-except-else-finally语句: 在except 语句中可以使用except as e,然后通 ...

  5. 笔记-python -asynio

    笔记-python -asynio 1.      简介 asyncio是做什么的? asyncio is a library to write concurrent code using the a ...

  6. 笔记-python lib-pymongo

    笔记-python lib-pymongo 1.      开始 pymongo是python版的连接库,最新版为3.7.2. 文档地址:https://pypi.org/project/pymong ...

  7. 笔记-python tutorial-9.classes

    笔记-python tutorial-9.classes 1.      Classes 1.1.    scopes and namespaces namespace: A namespace is ...

  8. 机器学习实战笔记(Python实现)-08-线性回归

    --------------------------------------------------------------------------------------- 本系列文章为<机器 ...

  9. 机器学习实战笔记(Python实现)-05-支持向量机(SVM)

    --------------------------------------------------------------------------------------- 本系列文章为<机器 ...

  10. 机器学习实战笔记(Python实现)-04-Logistic回归

    --------------------------------------------------------------------------------------- 本系列文章为<机器 ...

随机推荐

  1. [翻译] Facebook HHVM 团队封闭开发三周成果展

    本人翻译的一篇文章,首发于伯乐在线. [补充信息]HipHop for PHP是一系列PHP脚本语言的程式码转换器的集合,它包含HPHPc.HPHPi.HPHPd以及HHVM,这四个脚本引擎各有所不同 ...

  2. Android在应用设置里关闭权限,返回生命周期处理

    问题 在处理6.0运行时权限时,很多人都忽略了这样一个问题: 在一个App应用里,如果已经允许了一个权限比如(读取通讯权限),此刻去调用相机,弹出权限申请对话框,此刻点击拒绝,然后经过处理后弹出去设置 ...

  3. JSON.parse() 和 JSON.stringify()的简单介绍

    参考地址: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse ht ...

  4. 卸载VS2013 2015

    我有两个VS,特别讨厌,每当使用window程序删除时候,就出现 停止工作! 然后从知乎上发现了这个 https://github.com/Microsoft/VisualStudioUninstal ...

  5. C#使用Aspose.Words操作word文档

    最近接到个需求,由于客服这边要导出大量有一定规则的word文件,里面的内容希望系统自动填充,例如 这里我使用Aspose.Words.dll这个类库, 1.首先,我们需要创建模板文件,毕竟有规则的东西 ...

  6. LeetCode Longest Substring Without Repeating Characters 最长不重复子串

    题意:给一字符串,求一个子串的长度,该子串满足所有字符都不重复.字符可能包含标点之类的,不仅仅是字母.按ASCII码算,就有2^8=128个. 思路:从左到右扫每个字符,判断该字符距离上一次出现的距离 ...

  7. linux 命令——37 date (转)

    在linux环境中,不管是编程还是其他维护,时间是必不可少的,也经常会用到时间的运算,熟练运用date命令来表示自己想要表示的时间,肯定可以给自己的工作带来诸多方便. 1.命令格式: date [参数 ...

  8. JS encodeURIComponent函数

    为了避免歧义,可以用JS 的encodeURIComponent函数  将有歧义的字符(?+=等)转换成对应的ASCII编码 for(var i=0;i<whichform.elements.l ...

  9. 302和VS启动后网站拒绝访问的解决方案

    网页状态302代表的是重定向的意思,就是网页跳转的一种状态 网站拒绝访问的时候可以在输出窗口查看是否有内容输出,如果没有说明启动网站的端口可能被占用,在网站项目——属性——web——项目中把地址的端口 ...

  10. UVA 12161 Ironman Race in Treeland (树分治)

    题意:求树上的一条费用不超过m的路径,使得总长度尽量大. 人参第一发树分治,紫书上思路讲得比较清晰,这里不再赘述. 实现的时候,用一个类似时间戟的东西,记录结点首次访问的时间,并保存结点序列. 合并的 ...