返回顶部
首页 > 资讯 > 后端开发 > Python >python教程:__new__ 和 __init__及cls和self
  • 0
分享到

python教程:__new__ 和 __init__及cls和self

python教程__new____init__clsself 2024-02-02 09:02:34 0人浏览 佚名

Python 官方文档:入门教程 => 点击学习

摘要

1、__new__ 和 __init__两者的区别:__new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例对象,是个静态方法。__init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值,通常用在初始

1、__new__ 和 __init__

两者的区别:

  • __new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例对象,是个静态方法。

  • __init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值,通常用在初始化一个类实例的时候。是一个实例方法。

也就是: __new__先被调用,__init__后被调用,__new__的返回值(实例)将传递给__init__方法的第一个参数,然后__init__给这个实例设置一些参数;

说明:

  • 继承自object的新式类才有__new__

  • __new__至少要有一个参数cls,代表当前类,此参数在实例化时由python解释器自动识别

  • __new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类(通过super(当前类名, cls))__new__出来的实例,
    或者直接是object的__new__出来的实例

  • __init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值

  • 如果__new__创建的是当前类的实例,会自动调用__init__函数,通过return语句里面调用的__new__函数的第一个参数是 cls 来保证是当前类实例,
    如果是其他类的类名,那么实际创建返回的就是其他类的实例,其实就不会调用当前类的__init__函数,也不会调用其他类的__init__函数。

  • 在定义子类时没有重新定义__new__()时,Python默认是调用该类的直接父类的__new__()方法来构造该类的实例,如果该类的父类也没有重写__new__(),
    那么将一直按此规矩追溯至object的__new__()方法,因为object是所有新式类的基类。

举例:

下面的例子init不会执行,  因为init是在new返回创建的实例时才调用的(这里new并没有返回), new方法返回的实例会作为init的self参数:

class A(object):
    def __new__(cls):
        print('new')
                             
    def __init__(self):                                     
        print('init')
                                                  
A()


# 输出
new

下面这个例子init就会执行了:

class A(object):
    def __new__(cls):
        return super().__new__(cls)

    def __init__(self):
        print('init')

A()


# 输出
init

这样我们就可以自定义类的创建过程:

class Female:
    def __str__(self):
        return "I'm Female"

class Male:
    name = "w"
    def __new__(cls):
        if cls.name == "w":
            return super().__new__(Female)

    def __init__(self):
        return "I'm Male"


print(Male())


# 输出
I'm Female

cls 和 self其实只是一种命名习惯习惯, 是在PEP8中定义的.

cls:

cls作为第一个参数用来表示类本身. 在类方法中用到;

类方法是只与类本身有关而与实例无关的方法;

如果不想通过实例来调用类的函数属性,而直接用类调用函数方法,则这就是类方法,通过内置装饰器@calSSMethod
  类名.类方法()
  类方法只是给类使用(无论是否存在实例),只能访问实例属性(变量)

如下:

class A(object):
    a = 'a'

    @classmethod  # @classmethod是用来指定一个类的方法为类方法
    def repeat_a(cls, num=1):
        return cls.a * num


foo = A()
print(foo.repeat_a(2))


# 输出
aa

self:
self作为第一个参数用来表示类的实例, 在类的一般方法中用到. 类的一般方法与类的实例有关;

@staticmethod 静态方法只是名义上归属类管理,但是不能使用类变量和实例变量,是类的工具包,
放在函数前(该函数不传入self或者cls),所以不能访问类属性和实例属性

DEBUG = True

class A(object):
    a = 'a'
	#学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
    @staticmethod  #类中的一种静态方法, 用@staticmethod装饰器装饰,
    def is_debug():
        return DEBUG

    def show_error_messages(self):
        if self.is_debug():
            print('error_messages')
        else:
            print("123")


foo = A()
foo.show_error_messages()

--结束END--

本文标题: python教程:__new__ 和 __init__及cls和self

本文链接: https://lsjlt.com/news/560060.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python教程:__new__ 和 __init__及cls和self
    1、__new__ 和 __init__两者的区别:__new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例对象,是个静态方法。__init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值,通常用在初始...
    99+
    2024-02-02
    python 教程 __new__ __init__ cls self
  • python中__init__ 和__new__有什么区别
    python中__init__ 和__new__有什么区别?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。python的五大特点是什么python的五大特点:1....
    99+
    2023-06-15
  • Python的__Init__ 和__New__有什么区别
    这篇文章主要讲解了“Python的__Init__ 和__New__有什么区别”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python的__Init__ 和__New__有什么区别”吧!简...
    99+
    2023-07-06
  • Python中__new__和__init__的区别与联系
    __new__ 和 __init__ 的区别主要表现在: __new__ 负责对象的创建而 __init__ 负责对象的初始化。 __new__:创建对象时调用,会返回当前对象的一...
    99+
    2024-04-02
  • Python中__init__和__new__方法有什么用
    这篇文章给大家分享的是有关Python中__init__和__new__方法有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。__ init __方法init方法负责对象的初始化,系统执行该方法前,其实该对象...
    99+
    2023-06-02
  • Python类中__init__() 和self的详细解析
    目录1、Python中self的含义2、Python中为何要有self3、首先来看一下__init__()和self对象4、如果没有在__init__中初始化对应的实例变量的话,导致...
    99+
    2022-12-30
    python类中的__init__ python__init__用法 Python类 self
  • python教程之进程和线程
    目录进程和线程的区别和联系多进程线程池多线程总结进程和线程的区别和联系 终于开始加深难度,来到进程和线程的知识点~ 单就这两个概念,就难倒过不少初学者——今天...
    99+
    2024-04-02
  • Shell和Python学习教程总结
    博友们好,由于运维相关技术不断发展,个人能力也不断提高,日常积累的经验不能及时更新到以往的博文中。因此,为了更好的帮助大家学习运维技术,特地针对Shell和Python脚本语言总结了文档,此文档会不定期修改或增加知识点。 下载地址:百度云盘...
    99+
    2023-01-31
    教程 Shell Python
  • NoSQL和Redis简介及Redis在Windows下的安装和使用教程
    NoSQL简介 介绍redis前,我想还是先认识下NoSQL,即not only sql, 是一种非关系型的数据存储,key/value键值对存储。现有Nosql DB 产品: Redis/MongoDB/...
    99+
    2022-06-04
    简介 教程 NoSQL
  • Python入门教程(三十一)Python的Try和Except
    目录异常处理多个异常ElseFinally引发异常try 块允许您测试代码块以查找错误。 except 块允许您处理错误。 finally 块允许您执行代码,无论 try 和 exc...
    99+
    2023-05-18
    Python Try Python Except
  • Python 教程中如何使用 path 和 django?
    Python 是一门高级编程语言,它可以被用于开发各种类型的应用程序。随着Web应用程序的普及,Python也成为了最受欢迎的Web编程语言之一。而在Python中,path和django是两个非常重要的工具。本文将介绍如何在Python...
    99+
    2023-10-03
    教程 path django
  • Python Spyder下载、安装和使用教程
    Spyder 是一款功能强大的 Python IDE(集成开发环境),集编写、运行、调试 Python 程序于一身,可以安装到多个平台上,包括 Windows、Linux、Mac OS X。   图 1 Spyder Logo Sp...
    99+
    2023-10-21
    python 开发语言
  • Python编程实践操作教程:两数之和—Java和Python的代码对比
    Python编程实践操作教程:两数之和,分别用Java和Python表现!伙伴们可以做个对比!题目:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输...
    99+
    2023-06-02
  • MySQL和Navicat for MySQL下载及安装详细教程
    一、MySQL和Navicat for MySQL下载 点击:MySQL和Navicat for MySQL下载地址 提取码: wyhh 二、MySQL的安装 ![在这里插入图片描述](https:/...
    99+
    2023-09-27
    mysql 数据库 java
  • python数据结构和GIL及多进程
    1 queue 标准库queue模块,提供FIFO的queue、LIFO的队列,优先队列Queue 类是线程安全的,适用于多线程间安全的交换数据,内部使用了Lock和Condition 为什么说容器的大小不准确,其原因是如果不加...
    99+
    2023-01-31
    数据结构 进程 python
  • 如何使用git和Python教程一起load你的程序和文档?
    Git是一种用于版本控制和协作的工具,而Python是一种广泛使用的编程语言。两者的结合可以帮助您更轻松地管理代码、文档和其他项目文件。在本教程中,我们将介绍如何使用Git和Python一起load您的程序和文档。 第一步:安装Git和P...
    99+
    2023-06-26
    教程 load git
  • Python入门教程(二十二)Python的类和对象
    目录Python 类/对象创建类创建对象init() 函数对象方法self 参数修改对象属性删除对象属性删除对象pass 语句Python 类/对象 Python 是一种面向对象的编...
    99+
    2023-05-17
    Python入门 Python类 Python对象
  • windows上安装Anaconda和python的教程详解
    一提到数字图像处理编程,可能大多数人就会想到matlab,但matlab也有自身的缺点: 1、不开源,价格贵 2、软件容量大。一般3G以上,高版本甚至达5G以上。 3、只能做研究,不易转化成软件。 因此,...
    99+
    2022-06-04
    详解 教程 windows
  • Python 基础教程之包和类的用法
    Python 基础教程之包和类的用法 建立一个文件夹filePackage 在filePackage 文件夹内创建 __init__.py 有了 __init__.py ,filePackage才算...
    99+
    2022-06-04
    基础教程 Python
  • python之django路由和视图案例教程
    django路由和视图 要了解django是如何运行的,首先要了解路由和视图两个概念,然后我们在项目中添加一些简单的路由和视图 路由和视图的概念 视图:一个视图函数(类),简称视图,...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作