Python中__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中__new__方法的详细教程 - Python技术站

(0)
上一篇 2023年4月2日 下午4:27
下一篇 2023年4月2日

相关文章

  • Python教程:用__new__ 创建单例模式

    1.用 __new__方法 class Singleton(object): def __new__(cls): if not hasattr(cls,’_instance’): cls._instance=super(Singleton,cls).__new__(cls) # cls.__instance = object.__new__(cls) #这样…

    Python开发 2023年4月2日
    00
  • python学习:获取指定目录下所有文件名os.walk和os.listdir

    1.os.walk 返回指定路径下所有文件和子文件夹中所有文件列表 其中文件夹下路径如下: import os def file_name_walk(file_dir): for root, dirs, files in os.walk(file_dir): print(“root”, root) # 当前目录路径 print(“dirs”, dirs) #…

    Python开发 2023年4月2日
    00
  • Python条件语句和循环语句简单使用方法

    1.Python条件语句 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块。 可以通过下图来简单了解条件语句的执行过程:Python程序语言指定任何非0和非空(null)值为true,0 或者 null为false。 Python 编程中 if 语句用于控制程序的执行,基本形式为: if 判断条件: 执行语句………

    Python开发 2023年4月2日
    00
  • Python实现搭建-简单服务器教程

    Python动态服务器网页(需要使用WSGI接口),基本实现步骤如下:1.等待客户端的链接,服务器会收到一个http协议的请求数据报2.利用正则表达式对这个请求数据报进行解析(请求方式、提取出文件的环境)3.提取出文件的环境之后,利用截断取片的方法将文件名转化为模块名称4.使用m = __import__(),就可以得到返回值为m的模块5.创建一个env字典…

    python 2023年4月18日
    00
  • python面向对象教程:类和实例

    面向对象简介 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数…

    Python开发 2023年4月2日
    00
  • python中argparse模块的用法

    argparse 模块 一个可执行文件或者脚本都可以接收参数。 $ ls -l /etc /etc 是位置参数 -l 是短选项 如何把这些参数传递给程序呢?从3.2开始Python提供了功能强大的参数分析的模块argparse。 1.参数分类 参数分为: 位置参数,参数放在那里,就要对应一个参数位置。例如/etc就是对应一个参数位置。 选项参数,必须通过前面…

    Python开发 2023年3月31日
    00
  • Python学习:获取代理ip以及使用

    python爬虫浏览器伪装 #导入urllib.request模块 import urllib.request #设置请求头 headers=(“User-Agent”,”Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22…

    Python开发 2023年4月2日
    00
  • Python学习:迭代器与生成器

    1.生成器 如果创建一个有很多元素的列表,但是只需要访问前几个元素,后面的元素占着的空间就白白浪费了 在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。 在Python中,这种一边循环一边计算的机制,称为生成器:generator。 要创建一个generator,有很多种方法 第一种方法很简单,只要把一个列表生成式的[]…

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部