Python __new__()方法的定义与作用

newinit是Python中两个特殊的方法,其中new方法比较难理解,也比较少用到。这里我们详细讲解一下new方法的作用和用法。

new方法是Python中一个比较特殊的方法,它是一个类的构造器,用于创建类的实例。

new方法有以下两个特点:

  • 在实例化类时,new方法会在init方法之前被调用。
  • new方法是类方法,它需要传递一个cls参数,这个参数表示的是要实例化的类。

Python new方法的定义

new方法的定义形式为:

class MyClass:
    def __new__(cls, *args, **kwargs):
        # do something
        return super().__new__(cls, *args, **kwargs)

其中,cls表示当前类,args和kwargs分别表示传递给new方法的位置参数关键字参数new方法需要返回一个新的实例对象,这个实例对象会被传递给init方法。

new方法中,我们可以对实例对象进行一些特殊的操作,比如修改实例对象的类型、返回缓存的实例对象等等。

常见的用法包括:

Python new方法修改实例对象的类型

class MyInt(int):
    def __new__(cls, value):
        return super().__new__(cls, abs(value))

上述代码中,我们定义了一个名为MyInt的类,继承自int类。在new方法中,我们对实例对象的值进行了取绝对值的操作,从而改变了实例对象的类型。

Python new方法返回缓存的实例对象

class Singleton:
    _instances = {}

    def __new__(cls):
        if cls not in cls._instances:
            cls._instances[cls] = super().__new__(cls)
        return cls._instances[cls]

上述代码中,我们定义了一个名为Singleton的类,该类保证在运行时只有一个实例对象存在。在new方法中,我们使用一个字典_instances来保存已经创建的实例对象,如果字典中已经存在该类的实例对象,则直接返回该实例对象,否则创建一个新的实例对象并保存到字典中。

需要注意的是,如果我们重写了new方法,则必须返回一个实例对象,否则会抛出TypeError异常。

class MyClass:
    def __new__(cls):
        pass

MyClass()
# TypeError: __new__() should return a new instance of type, not 'NoneType'

总的来说,new方法是一个比较底层的方法,它负责创建实例对象并返回给init方法进行初始化。在实际开发中,我们很少需要重写new方法,除非我们需要对实例对象进行一些特殊的操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python __new__()方法的定义与作用 - Python技术站

(2)
上一篇 2023年2月23日 上午11:55
下一篇 2023年2月21日 下午1:12

相关文章

  • Python整数类型(int)详解

    Python中的整数类型 在数学中,整数就是正整数、零、负整数的集合。在Python中,对于整数的定义也与此相同。 强类型编程语言的整数,一般会限定整数长度,以分配不同的存储空间。因此整数类型的声明关键字会有:short、int、long、long long等,它们的长度依次递增,开发者需要根据实际数字的大小选用不同的类型。 而Python则不同,它只有一种…

    2022年11月20日
    00
  • Python 赋值运算符

    赋值运算符通常是指将右侧的值赋值给左侧的变量(或者常量)中。这类的赋值运算符用等号“=”表示。 同时,赋值时也可以进行某些算数运算后,再赋值给左侧的变量。比如加减乘除运算、函数调用、逻辑运算等。这类的赋值通常需要结合其他运算符,比如+=、-=、*=、/=等等。 “=”赋值运算符 “=”是 Python 中最常见、最基本的赋值运算符,它直接将右侧的值赋值给左侧…

    Python运算符 2022年12月19日
    00
  • 详解 Python 的局部函数及用法

    Python中的局部函数是在函数内部定义的函数,也被称为内部函数或嵌套函数。 局部函数的特点是:只能在定义它的函数内部调用,而不能在其他函数或全局作用域中调用。 局部函数在许多情况下都很有用,可以减少全局命名空间的污染,提高代码可读性和可维护性。下面是一个简单的示例,展示了如何定义和使用局部函数: def outer_function(): def inne…

    2023年2月20日
    00
  • Windows系统安装Python

    本章我们正式开始学习Python的入门课程。 在学习Python之前,你要做的第一件事,就是安装Python环境。 由于Python官方已不再维护Python2.x,所以本系列课程将使用最新的Python3.x版本作为Python环境,不再考虑Python2.x版本的兼容性。让我们面向未来,拥抱Python3吧。 下载Python安装包 首先进入Python…

    2022年10月30日
    10
  • Python pass关键字的作用

    在 Python 中,pass 是一个占位符关键字,可以被用于在代码中占据一个语句位置,而不做任何实际操作。pass 语句不会执行任何操作,仅仅是用来保持程序结构的完整性。 pass 语句的主要作用是作为占位符,当我们暂时不确定一个程序应该写什么代码时,可以使用 pass 语句占位,以保证代码的结构完整性。 下面是一个简单的示例,演示了 pass 关键字的使…

    2023年2月16日
    00
  • 详解 Python 操作多个文件(fileinput)模块使用方法

    fileinput是Python内置模块之一,它提供了一种方便的方式来迭代处理多个文件或标准输入。使用fileinput模块,可以很容易地遍历多个文件的所有行,而不必手动打开和关闭每个文件。 fileinput模块中最常用的函数是input(),它可以迭代处理多个文件或标准输入。它的用法是将文件名作为参数传递给input()函数,然后使用for循环来处理每一…

    2023年2月25日
    00
  • Python linecache模块详解:读取文本文件的某一行

    Python的linecache模块是一个内置的模块,用于在Python中读取文本文件的某一行。它可以实现高效的文件行缓存和缓存行号和行内容。 linecache模块提供了3个函数来读取文本文件的行: linecache.getline(filename, lineno[, module_globals]):返回指定文件中的指定行,lineno为行号,从1开…

    2023年2月25日
    00
  • Python finally的两种使用场景

    在 Python 中,finally 用于定义一个代码块,无论 try 块中是否出现异常,它都将始终执行。通常使用 finally 块来执行清理操作,例如关闭文件或释放资源。 Python finally基本使用方法 以下是 finally 块的基本语法: try: # 可能会出现异常的代码块 except Exception: # 处理异常的代码块 els…

    2023年2月26日
    00
合作推广
合作推广
分享本页
返回顶部