__new__方法实际上在__init__方法之前执行,用于创建类的实例。然而__init__方法负责实例创建后对其进行自定义,__new__方法才是实际上创建并返回实例的方法。

__new__方法的第一个也是最重要的参数是创建实例所需的要的类(按照惯例,命名为cls)。

在大多数起概况下,__new__方法的其他参数会被完整复制到__init__方法中。参数在调用类构造函数时首先会被传递给__new__方法,然后再传递给__init__方法。

在实际应用中,大多数类无需定义__new__方法。该方法在python中的内置实现已经足够。

通常,我们希望__new__方法返回一个已经被初始化后的类的实例。在某些情况下,并不需要这么做。需要注意的是,只有在通过__new__方法返回当前类的实例时才会执行__init__方法。如果返回的不是当前类的实例,就不会调用__init__方法。

class MyClass(object):

def __new__(cls,a):

print("__new__  被调用,参数为:%d"%a)

#在实现__new__方法的时候,应该首先调用父类的__new__方法

#然后再开始自定义的逻辑

#调用父类__new__方法创建实例,并返回

return object.__new__(cls)

def __init__(self,a):

print("__init__ 被调用,参数为:%d"%a)

#解释器先将参数100传递给__new__方法

#如果__new__方法创建对象,那么会调用__init__方法

#这时会将参数100再传递给__init__方法

mclass = MyClass(100)

总结

  • __new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供;
  • __new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类__new__出来的实例,或者直接是object的__new__出来的实例;
  • __init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值;
  • 我们可以将类比作制造商,__new__方法就是前期的原材料购买环节,__init__方法就是在有原材料的基础上,加工,初始化商品环节。

python中的__new__概念(工厂相关推荐

  1. python中变量,python中变量的概念

    python中变量的概念 在python中,变量就是一种标识符, 它是数据的名字,更专业的理解,变量是内存中数据的引用, 编程语言里的变量和初中学习代数时的方程变量很相似. 前面学习数字类型,bool ...

  2. python中的__new__与__init__,新式类和经典类(2.x)

    在python2.x中,从object继承得来的类称为新式类(如class A(object))不从object继承得来的类称为经典类(如class A()) 新式类跟经典类的差别主要是以下几点: 1 ...

  3. python中__init__后面加特殊符号_详解Python中的__new__、__init__、__call__三个特殊方法...

    __new__: 对象的创建,是一个静态方法,第一个参数是cls.(想想也是,不可能是self,对象还没创建,哪来的self) __init__ : 对象的初始化, 是一个实例方法,第一个参数是sel ...

  4. 简述python中面向对象的概念_简述Python中的面向对象编程的概念

    面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机 ...

  5. python中的__new__和__init__

    一.__init__ 方法是什么? 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__ 方法通常用在初始化一个类实例的时候. 这样便是__init ...

  6. python中对象的概念是什么_简述Python中的面向对象编程的概念

    面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机 ...

  7. Python中的__new__()方法的使用

    __new__() 函数只能用于从object继承的新式类. 先看下object类中对__new__()方法的定义: class object:   @staticmethod # known cas ...

  8. python中对象的概念是什么_python面向对象编程的基本概念

    作者|HIMANSHI SINGH 编译|VK 来源|Analytics Vidhya 介绍 在学习面向对象编程时,我决定深入研究它的历史,结果发现它很迷人.术语"面向对象编程"( ...

  9. Haskell与Python中的一些概念,若有所悟

    转自:http://blog.csdn.net/tangboyun/archive/2010/04/03/5447688.aspx 首先,必须声明的是,下面所写的内容,只是我个人的一些体验和感悟,受限 ...

最新文章

  1. ldap 统一认证 java_如何在你的系统里集成LDAP统一认证
  2. thinkphp5 使用PHPExcel 导入导出
  3. 【Android CPU 优化】Android CPU 调优 ( Trace 文件分析 | Android Profiler 工具 | CPU Profiler 工具 )
  4. 密码篇——对称加密—AES
  5. python手机号码正确编程_python 小练习之生成手机号码
  6. python解密_Python解密
  7. Java中gatSum方法是什么_Oracle中的SUM用法讲解
  8. java invoke int long,将Long转换为Integer
  9. 机器学习- 吴恩达Andrew Ng Week9 知识总结 Anomaly Detection
  10. 自己动手破解斯凯Mrp游戏
  11. Linux下服务器基本环境搭建步骤详解(三种软件安装方式)
  12. 百度地图样式冲突问题
  13. 暴力计算一元二次方程的求解方法
  14. DBUS介绍与Linux C实例
  15. 【项目小tips】scoped属性的使用
  16. 陈勇写的滚动条类及使用举例
  17. adas记录仪app_免费用的ADAS 极目启行APP道路测试
  18. 【numpy_financial金融函数-复现复利威力】
  19. 全球及中国风力发电行业运维模式及十四五投资策略研究报告2021-2027年
  20. 查找数组中的重复元素

热门文章

  1. 项目开发日志:Build AssetBundle——SpriteAtlas(已解惑)
  2. Java微信公众平台获取签名
  3. [JZOJ P1288] [DP]矩阵取数
  4. [转]html超链接打开的窗口大小
  5. 【iCore3 双核心板】例程三十五:HTTP_IAP_ARM实验——更新升级STM32
  6. 迪美特TVZ8双核智能高清播放器 在电视上编程不是梦
  7. UDT源码剖析(二):UDT自带例程recvfile注释
  8. 首个开源 Linux 系统登陆火星,占有率超 Windows,一同登录还有一款安卓手机芯片...
  9. printf 宏 调试技巧
  10. python快递代取系统_代取快递的变现方式,校园跑腿的经营范围有多大?