笔记-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. java8 api简介(一)

    from https://www.aliyun.com/jiaocheng/785076.html 摘要:函数式编程详解:前言:现在有很多公司都用了jdk8,但是函数式编程也许没有用上,jdk8也提供 ...

  2. Linux常用操作2

    第1章 find命令扩展 转自:https://www.cnblogs.com/clsn/p/7520333.html 1.1 方法一 |xargs 通过|xargs将前面命令的执行结果传给后面. [ ...

  3. JavaScript初识(二)

    接上一篇: 九丶伪数组 arguments arguments代表的是实参.有个讲究的地方是:arguments只在函数中使用 (1)返回函数实参的个数:arguments.length fn(2,4 ...

  4. ajax的jquery写法和原生写法

    一.ajax的简介 Ajax被认为是(Asynchronous(异步) JavaScript And Xml的缩写).现在,允许浏览器与服务器通信而无须刷新当前页面的技术都被叫做Ajax. 同步是指: ...

  5. ios微信浏览器音乐自动播放

    setTimeout(function(){ //一般情况下,这样就可以自动播放了,但是一些奇葩iPhone机不可以 document.getElementById('bgmedia').play() ...

  6. slfj4 + logback

    slf4j:(Simple Logging Facade for Java,简单日志门面),它不是具体的日志解决方案,只服务于各种各样的日志系统.在使用SLF4J的时候,不需要再代码中或配置文件中指定 ...

  7. 百倍性能的PL/SQL优化案例(r11笔记第13天)

    我相信你是被百倍性能的字样吸引了,不过我所想侧重的是优化的思路,这个比优化技巧更重要,而结果嘛,其实我不希望说成是百倍提升,“”自黑“”一下. 有一个真实想法和大家讨论一下,就是一个SQL语句如果原本 ...

  8. pat甲级1013

    1013 Battle Over Cities (25)(25 分) It is vitally important to have all the cities connected by highw ...

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

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

  10. JavaScript模块化开发的那些事

    模块化开发在编程开发中是一个非常重要的概念,一个优秀的模块化项目的后期维护成本可以大大降低.本文主要介绍了JavaScript模块化开发的那些事,文中通过一个小故事比较直观地阐述了模块化开发的过程. ...