python教程:__new__ 和 __init__及cls和self

这篇具有很好参考价值的文章主要介绍了python教程:__new__ 和 __init__及cls和self。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

2、cls和self

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),所以不能访问类属性和实例属性文章来源地址https://www.toymoban.com/news/detail-801807.html

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()

到了这里,关于python教程:__new__ 和 __init__及cls和self的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 技术面试与HR面:两者之间的关联与区别

    🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页 ——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍专栏》 🐾 学会IDEA常用操作,工作效率翻倍~💐 🌊 《100天精通Golang(基础

    2024年02月10日
    浏览(36)
  • Gradle和Maven的详细讲解和两者之间的区别

    Gradle 是一种基于 Groovy 语言的构建自动化工具,用于构建、测试和部署项目。它使用声明式的脚本来定义构建过程,允许开发者灵活地配置项目构建。Gradle 使用一种被称为 Groovy DSL(领域特定语言)的语法,使构建脚本易于编写和维护。 主要特点: 声明式构建脚本: Gradle

    2024年02月12日
    浏览(40)
  • CCR量化机器人:数字藏品=NFT?两者有什么区别?

    在很多时候,人们习惯将数字藏品与 NFT 混为一谈,但数字藏品不等于 NFT,其本质上还是有很大的差异。 ​ 1 什么是NFT NFT,全称为Non-Fungible Token,指非同质化代币,是以太坊(Ethereum)用以代表独特物品所有权的代币。从技术上说,NFT是一种基于区块链技术的契约的数字化凭

    2024年01月25日
    浏览(43)
  • spingboot按照依赖包除了maven还有Gradle,两者的区别?

    Maven和Gradle是两种常用的构建工具,用于管理Java项目的依赖关系和构建过程。它们之间的区别如下: 语法:Maven使用XML作为构建文件的格式,而Gradle使用基于Groovy或Kotlin的领域特定语言(DSL)。 灵活性:相比Maven,Gradle提供更大的灵活性和自定义能力。Gradle的DSL允许你以声明

    2024年02月10日
    浏览(33)
  • 低代码开发会取代传统开发吗? 两者有什么区别 该如何选择

    低代码开发技术在近几年逐渐被普及,帮助很大一部分开发者完成了复杂的工作。由于低代码开发方案入门门槛低且上手难度小,所以即使是非专业人士也可借助其便利性自主开发软件系统,整个开发过程几乎不需要专业程序员。久而久之就出现了一种声音, 即低代码方案的

    2024年01月19日
    浏览(42)
  • 加密标准中DES与AES到底是什么?两者有啥区别?

    我们生活在一个信息爆炸的时代,各类隐私数据的保护成了现代信息技术中最为重要的技术之一。 加密 就是保护数据最直接也是应用最为广泛的方法。 加密是将一种形式的信息(通常是人类可读的)转换为另一种形式(通常不是人类可读的)的过程。它以数学为基础,并利

    2024年02月06日
    浏览(84)
  • Unity还是Three.js:两者的区别、优缺点以及如何选择

    个人主页: 左本Web3D,更多案例预览请点击==》 在线案例 个人简介:专注Web3D使用ThreeJS实现3D效果技巧和学习案例 💕 💕积跬步以至千里,致敬每个爱学习的你。喜欢的话请三连,有问题请私信或者加微信 介绍:         Three.js是一个JavaScript库,它可以在Web浏览器中创

    2024年02月04日
    浏览(41)
  • 信息安全圈都在谈论CISP,CISSP,这两者有什么区别呢?

    CISP(Certified Information Security Professional)认证考试是由国际信息系统安全认证联盟(ISC)²所开发和管理的,主要考核信息安全专业人员在保障企业信息系统安全方面的知识和技能,主要适用于网络和系统管理员、安全工程师等信息安全从业人员。CISP考试主要涵盖以下十个领域

    2024年02月08日
    浏览(46)
  • 什么是信息化?什么是数字化?这两者有什么联系和区别?

    数字经济时代,信息化、数字化成了高频词,它们之间既有区别,又紧密关联,简而言之,信息化是一种管理手段,数字化是推进信息化的方法,那么,到底什么是数字化?什么是信息化?两者有什么区别和联系? 信息化的概念起源于60年代的日本,首先是由日本学者梅棹忠

    2024年02月04日
    浏览(49)
  • 大数据大比拼:Hive vs HBase,你知道两者的区别和适用场景吗?

    Apache Hive和Apache HBase是两个非常流行的分布式数据存储技术。尽管两者都是Apache软件基金会的项目,但它们被设计用于不同的用例。在本篇博客中,我们将介绍Hive和HBase的基本概念,以及它们的区别和应用场景。 Apache Hive是一种基于Hadoop的数据仓库软件,它允许用户使用SQL来

    2023年04月09日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包