我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么使用HTML5__init__、__new__、__call__方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么使用HTML5__init__、__new__、__call__方法

这篇文章主要讲解了“怎么使用HTML5__init__、__new__、__call__方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用HTML5__init__、__new__、__call__方法”吧!

任何事物都有一个从创建,被使用,再到消亡的过程,在程序语言面向对象编程模型中,对象也有相似的命运:创建、初始化、使用、垃圾回收,不同的阶段由不同的方法(角色)负责执行。

在面试的时候,问到面向对象免不了会问__init__、__new__、__call__ 方法这几个最常用的魔术方法。在这里为大家厘清这几个方法的用法:

__init__方法

__init__方法负责对象的初始化,系统执行该方法前,其实该对象已经存在了,要不然初始化什么东西呢?先看例子:

class Dog:
   def __init__(self):
       print("__init__ ")
       super(A, self).__init__()

   def __new__(cls):
       print("__new__ ")
       return super(A, cls).__new__(cls)

   def __call__(self):  # 可以定义任意参数
       print('__call__ ')

Dog()

输出结果为:

__new__
__init__

从输出结果来看,__new__方法先被调用,返回一个实例对象,接着__init__被调用。__call__方法并没有被调用,这个我们放到最后说,先来说说前面两个方法,稍微改写成:

def __init__(self):
   print("__init__ ")
   print(self)
   super(A, self).__init__()

def __new__(cls):
   print("__new__ ")
   self = super(A, cls).__new__(cls)
   print(self)
   return self

输出为:

<__main__.A object at 0x1007a95f8>
__init__
<__main__.A object at 0x1007a95f8>

从输出结果来看,__new__ 方法的返回值就是类的实例对象,这个实例对象会传递给 __init__ 方法中定义的 self 参数,以便实例对象可以被正确地初始化。

如果 __new__ 方法不返回值(或者说返回 None)那么 __init__ 将不会得到调用,这个也说得通,因为实例对象都没创建出来,调用 init 也没什么意义,此外,Python 还规定,__init__ 只能返回 None 值,否则报错。

__init__方法可以用来做一些初始化工作,比如给实例对象的状态进行初始化:

def __init__(self, a, b):
   self.a = a
   self.b = b
   super(A, self).__init__()

另外,__init__方法中除了self之外定义的参数,都将与__new__方法中除cls参数之外的参数是必须保持一致或者等效。

class B:
   def __init__(self, *args, **kwargs):
       print("init", args, kwargs)

   def __new__(cls, *args, **kwargs):
       print("new", args, kwargs)
       return super().__new__(cls)

B(1, 2, 3)

# 输出

new (1, 2, 3) {}
init (1, 2, 3) {}

__new__ 方法

一般我们不会去重写该方法,除非你确切知道怎么做,什么时候你会去关心它呢,它作为构造函数用于创建对象,是一个工厂函数,专用于生产实例对象。著名的设计模式之一,单例模式,就可以通过此方法来实现。

class DatabasePools:
   _singleton = None
   def __new__(cls, *a, **k):
       if not cls._singleton:
           cls._singleton = object.__new__(cls, *a, **k)
       return cls._singleton

这就是通过__new__方法是实现单例模式的的一种方式,如果实例对象存在了就直接返回该实例即可,如果还没有,那么就先创建一个实例,再返回。

小结:

  • __ new__ 用于创建一个对象,有返回值;__new__是类方法;__ init__ 用于初始化对象,没有返回值

  • __new__默认参数是cls,系统传递的是类名,__init__默认参数是self,系统传递的是当前对象

  • __ new__ 先于__ init__ 执行

__call__ 方法

关于 __call__ 方法,不得不先提到一个概念,就是可调用对象(callable),我们平时自定义的函数、内置函数和类都属于可调用对象,但凡是可以把一对括号()应用到某个对象身上都可称之为可调用对象,判断对象是否为可调用对象可以用函数 callable

如果在类中实现了 __call__ 方法,那么实例对象也将成为一个可调用对象,我们回到最开始的那个例子:

a = Dog()
print(callable(a))  # True

a是实例对象,同时还是可调用对象,那么我就可以像函数一样调用它。试试:

a()  # __call__

很神奇不是,实例对象也可以像函数一样作为可调用对象来用,那么,这个特点在什么场景用得上呢?这个要结合类的特性来说,类可以记录数据(属性),而函数不行(闭包某种意义上也可行),利用这种特性可以实现基于类的装饰器,在类里面记录状态,比如,下面这个例子用于记录函数被调用的次数:

class Counter:
   def __init__(self, func):
       self.func = func
       self.count = 0

   def __call__(self, *args, **kwargs):
       self.count += 1
       return self.func(*args, **kwargs)

@Counter
def foo():
   pass

for i in range(10):
   foo()

print(foo.count)  # 10

感谢各位的阅读,以上就是“怎么使用HTML5__init__、__new__、__call__方法”的内容了,经过本文的学习后,相信大家对怎么使用HTML5__init__、__new__、__call__方法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么使用HTML5__init__、__new__、__call__方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么使用HTML5__init__、__new__、__call__方法

这篇文章主要讲解了“怎么使用HTML5__init__、__new__、__call__方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用HTML5__init__、__new__、
2023-06-01

Python中__new__方法有什么用

这篇文章主要为大家展示了“Python中__new__方法有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Python中__new__方法有什么用”这篇文章吧。一、__new__方法简介接
2023-06-29

Python中__init__和__new__方法有什么用

这篇文章给大家分享的是有关Python中__init__和__new__方法有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。__ init __方法init方法负责对象的初始化,系统执行该方法前,其实该对象
2023-06-02

Python中__new__方法有什么作用

本篇内容介绍了“Python中__new__方法有什么作用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、__new__方法简介接下来通过
2023-07-06

Python 中__new__方法的作用是什么

今天就跟大家聊聊有关Python 中__new__方法的作用是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。__new__ 的作用在Python中__new__方法与__init
2023-06-02

__init__、forward、__call__三者怎么在pytorch中使用

本篇文章给大家分享的是有关__init__、forward、__call__三者怎么在pytorch中使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1)__init__主要
2023-06-06

怎么在python中使用__call__触发执行

怎么在python中使用__call__触发执行?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。python的数据类型有哪些?python的数据类型:1. 数字类型,包括in
2023-06-15

preventDefault()方法怎么使用

preventDefault()方法用于取消事件的默认行为。在JavaScript中,可以通过以下方式使用preventDefault()方法:1. 通过事件对象使用preventDefault()方法:```javascripteleme
2023-09-05

waifu2x方法怎么使用

要使用Waifu2x方法,你可以按照以下步骤进行:打开Waifu2x的网页或下载相应的软件。Waifu2x有许多不同的版本和实现方式,你可以选择适合你的平台和需求的版本。准备要提升分辨率的图像。你可以选择从你的计算机中选择图像文件,或者在一
2023-10-26

Window.open()方法怎么使用

window.open()方法用于打开一个新的浏览器窗口,并返回一个对这个新窗口的引用。语法:window.open(URL, name, specs, replace)参数说明:- URL:要在新窗口中打开的URL地址。可以是一个绝对路径
2023-09-06

Java Hibernate使用方法怎么使用

今天小编给大家分享一下Java Hibernate使用方法怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Jpa是满足
2023-07-05

jquery toggle方法怎么使用

jQuery的toggle()方法可以用于切换元素的可见性。它根据元素的当前状态决定是显示还是隐藏元素。使用toggle()方法的语法如下:```javascript$(selector).toggle();```其中,selector是一
2023-09-20

java validate方法怎么使用

在Java中,要使用validate方法,首先需要确保你正在使用的是合适的类或接口。一些常见的使用validate方法的类或接口包括:javax.validation.Validator:用于验证Java Bean的实例。javax.xm
2023-10-24

Android onFinishInflate方法怎么使用

在Android中,onFinishInflate方法是View类中的一个方法,用于在View被inflate(填充)后调用。具体使用方法如下:1. 在自定义的View类中,重写onFinishInflate方法。代码示例:```javap
2023-10-12

ForwardRef useImperativeHandle方法怎么使用

本文小编为大家详细介绍“ForwardRef useImperativeHandle方法怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“ForwardRef useImperativeHandle方法怎么使用”文章能帮助大家解决疑惑
2023-07-05

jquery include方法怎么使用

本篇内容介绍了“jquery include方法怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是jQuery include方法
2023-07-05

java toarray方法怎么使用

在Java中,toArray()方法用于将集合(如List、Set等)转换为数组。它可以按照集合的迭代顺序,将集合中的元素复制到新的数组中。使用toArray()方法的一般语法如下:javaObject[] array = collecti
2023-10-20

java default方法怎么使用

Java 8引入了默认方法(Default Method),也称为接口默认方法(Interface Default Method)。默认方法是在接口中定义的具有默认实现的方法。这使得接口能够在不破坏实现类的情况下向已有接口添加新的方法。要使
2023-10-10

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录