首页 > 编程语言 >Python中__new__方法的详细教程

Python中__new__方法的详细教程

时间:2022-11-10 21:15:27浏览次数:45  
标签:__ Python object Person init print new

只有继承于object的新式类才能有__new__方法,__new__方法在创建类实例对象时由Python解释器自动调用,一般不用自己定义,Python默认调用该类的直接父类的__new__方法来构造该类的实例,如果该类的父类也没有重写__new__,那么将一直按此规矩追溯至object的__new__方法,因为object是所有新式类的基类,若需要自定义__new__方法,一般用法如下:

class Person(object):
    def __new__(cls):
        return  object.__new__(cls)

__new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供;__new__必须要有返回值,返回实例化出来的实例,可以return父类new出来的实例,或直接是object的new出来的实例。

object.new(cls)执行完返回的结果为Person类的实例对象,如下:

class Person(object):
    def __init__(self):
        print("__init__")
        self.name="张三"
    def __new__(cls):
        print('__new__')
        ob = object.__new__(cls)#ob为Person实例对象
        print(ob)
        return ob
p1 = Person()
print(p1.name)

在这里插入图片描述
p1=Person()该语句主要做了以下工作:
首先调用Person的__new__方法,该方法通过object.new(cls)创建了Person实例对象,并返回。最后调用了该Person实例对象的__new__方法。

object.new()方法接收的参数是类对象,可以不是当前类对象cls,如果将cls换成其他类对象会发生什么呢,看下面代码的运行结果:

class Dog(object):
    def __init__(self):
        self.name="旺财"
        print("Dog.__init__")
class Person(object):
    def __init__(self):
        self.name="张三"
        print("Person.__init__")
    def __new__(cls):
        print('__new__')
        ob = object.__new__(Dog)
        return ob
p1 = Person()
print(type(p1))

在这里插入图片描述
由结果得知p1是Dog类的实例,但是有个问题,Python解释器没有自动执行__new__方法,由结果可以看出并没有打印字符串__new__。若__new__()没有正确返回当前类cls的实例,那__init__()将不会被调用。 我们可以在__new__方法中手动调用__new__方法(实际开发中好像没什么用)

class Dog(object):
    def __init__(self):
        self.name="旺财"
        print("__init__")

class Person(object):
    def __init__(self):
        self.name="张三"
        print("__init__")
    def __new__(cls):
        print('__new__')
        ob = object.__new__(Dog)
        ob.__init__()
        return ob

p1 = Person()
print(type(p1))
print(p1.name)

在这里插入图片描述

标签:__,Python,object,Person,init,print,new
From: https://www.cnblogs.com/djdjdj123/p/16878768.html

相关文章

  • SPI驱动详解
    前言最近研究在linux内核下,主机通过SPI与另外一个板卡通信,该板卡将收到的信息加密后又通过SPI给到主机。其实就是将另外一个板卡看作一个外置的SPI设备,更贴切来说就甚至......
  • webpack与grunt、gulp的不同
    首先,它们的共同点三者都是前端构建工具,grunt和gulp早期比较流行,现在webpack是主流;区别:grunt和gulp基于任务和流;webpack基于入口文件,webpack会自动解析入口......
  • 模板和泛型编程 C++ primer笔记
    16.1定义模板重载多个相似的函数是麻烦的:比如重载能接受多个类型的compare。使用函数模板之后可以定义成这样:template<typenameT>intcompare(constT&v1,constT......
  • 对拍
    对拍2022.11.10背景CSP复赛前一个晚上才匆匆看了一眼对拍,直到现在才看到还搁在这,赶紧补救一下……对拍程序#include<bits/stdc++.h>#include<windows.h>#include<ct......
  • servlet实操之filter过滤器
    Filter过滤器:用来过滤网站的数据处理中文乱码登录验证...实现过程1、导包2、编写过滤器​ 2.1、包不要到错</dependency><!--JSTL表达......
  • servlet实操之监听器Listener
    监听器实现一个监听器的接口:1、编写一个监听器publicclassOnlineCountListenerimplementsHttpSessionListener{//创建session的监听@Overridepubli......
  • java——循环控制语句——for——while——do……while——整理02
                                                        ......
  • tekla软件安装教程
    Tekla2020WIN1064位安装步骤:1.先使用“百度网盘客户端”下载Tekla2020_x64软件安装包到电脑磁盘,并鼠标右击进行解压缩,安装前先断开电脑网络,然后找到TeklaStructures2020......
  • P7737 [NOI2021] 庆典
    题意给定一张有向图,每次询问给出\(s,t\),求从\(s\tot\)的路径上(可以有重复点)可能会经过多少个点,每次询问会临时加入\(k\)条边。其中,题目给出的图有如下特点:若\(x\)......
  • win10 右键增加获取管理员权限
    1、新建txt空白文档2、复制以下代码到文档中保存,重命名文档为1.reg  txt文档会变成一个魔方图标的可执行的文件,执行它即可WindowsRegistryEditorVersion5.00;......