init()方法和new方法

本文深入解析Python中的__init__和__new__方法,探讨它们在对象创建和初始化过程中的角色和区别,通过实例代码展示其工作原理。
python中的init()方法和new方法

首先我们来了解一下init()方法,init()是一个实例方法,init()内置方法在创建对象的时候自动执行无返回值,我们可以在init()做一些初始化操作,接下来用代码来了解一下它的作用

class Person:
    def __init__(self,name):
        print("我是初始化方法")
        self.name=name   #实例属性
        self.age=20
    def person(self):
        print("大家好,我叫{},我今年{}岁,祝大家开心每一天".format(self.name,self.age))
per=Person("snowdream")
per.person()

结果:
在这里插入图片描述
通过以上代码我们发现在创建对象的时候init()方法就自动执行了,并且把实例属性在各自对象的内存中都保存一份,描述类创建出来的实例化对象。
接下来我们再了解一下new方法,__new__是一个静态方法,__new__方法会返回一个创建的实例,作用就是实例化对象,其中实例化对象是Object类底层实现,其它类继承了Object的new才能够实现 实例化对象。 我们用代码来来了解一下

class Dog(object):
    def __new__(cls, *args, **kwargs):
        print("----__new__----")
        new__=object.__new__(cls)
        return new__
dog=Dog()
print(dog)

结果:
在这里插入图片描述
由上可以看出调用父类new方法,创建当前对象
说到这里那__new__和__init__到底有啥关系不妨我们看一下代码

class Dog(object):
    def __init__(self):
        print("----__init__---")
    def __del__(self):
        print("----__del__----")
    def __new__(cls, *args, **kwargs):
        print("----__new__----")
        new__=object.__new__(cls)
        return new__
dog=Dog()
print(dog)

结果:
在这里插入图片描述
由上可以看出来调用父类的__new__方法就可以创建对象,返回一个cls的实例传递__init__方法,这时__init__才能被调用,__init__接下来完成初始化操作。

<think>好的,我现在需要回答用户关于HMAC的init方法update方法的问题。首先,我得确认用户对HMAC的理解程度,可能需要先简单介绍一下HMAC是什么。HMAC是Hash-based Message Authentication Code,也就是基于哈希的消息认证码,用于验证消息的完整性真实性。通常结合哈希函数(比如SHA-256或SM3)一个密钥来生成MAC。 接下来,用户问的是HMAC的initupdate方法。这两个方法属于HMAC的API接口部分,常见于编程库中,比如Python的hmac模块或者Java的Mac类。我需要解释这两个方法的作用使用场景。 首先,init方法。在HMAC的计算过程中,首先需要初始化一个HMAC对象,这时候就需要调用init方法,并传入密钥可能的哈希算法参数。例如,在Python中,hmac.new(key, msg=None, digestmod='')中的new函数就相当于初始化,其中key是密钥,digestmod指定哈希函数。这一步的作用是设置HMAC的基本参数,准备后续处理数据。 然后是update方法。这个方法用于逐步输入要处理的数据。当消息很大或者分多次传输时,可以多次调用update方法追加数据,而不需要一次性将整个消息加载到内存中。这对于处理大文件或流式数据非常有用,节省内存资源。例如,在Python中,可以多次调用h.update(chunk)来处理数据块,最后再调用h.digest()或h.hexdigest()获取最终的HMAC值。 需要确认用户是否了解分块处理的概念,可能需要简单解释为什么需要update方法。比如,如果有一个很大的文件,直接读取整个文件到内存可能会影响性能,分块处理更为高效。此外,多次update调用的结果一次性处理整个消息的结果是一致的,这是HMAC算法的特性之一。 可能还需要提到,在调用update之后,必须调用digest或hexdigest来获取最终的认证码,否则无法得到结果。另外,init方法通常只需要调用一次,而update可以多次调用,但顺序很重要,必须按照消息的实际顺序来调用,否则会导致最终的HMAC值不同,从而验证失败。 有没有可能用户把HMAC的initupdate与其他加密算法的方法混淆了?比如对称加密中的初始化向量(IV)或者update方法。需要明确区分,HMAC的update是用于消息输入,而加密算法中的update可能用于加密数据块。 另外,是否需要给出示例代码?比如用Python或Java展示initupdate的使用流程?可能对用户理解更有帮助,但用户没有明确要求,但根据之前的回答风格,用户可能希望有结构化的解释,可能包括步骤或示例。 还要注意术语的准确性,比如密钥(secret key)、哈希函数、消息认证码等,确保用户不会混淆这些概念。同时,是否需要比较HMAC其他MAC算法的不同,比如CMAC?可能不需要,用户的问题集中在initupdate方法上。 最后总结一下,确保回答结构清晰,分点说明initupdate的作用、使用方式注意事项,帮助用户逐步理解这两个方法在HMAC实现中的角色。</think>--- ### **HMAC 的 `init` 与 `update` 方法详解** HMAC(Hash-based Message Authentication Code)是一种基于哈希函数密钥的消息认证码算法,用于验证数据完整性真实性。其实现中通常包含 `init`(初始化) `update`(更新数据)方法,以下是具体解释: --- ### **1. `init` 方法:初始化 HMAC 上下文** - **作用**: 创建 HMAC 计算所需的上下文环境,绑定密钥与哈希算法。 - **参数**: - **密钥(key)**:必须保密的二进制数据,长度建议与哈希函数分组长度匹配(例如 SHA-256 建议 64 字节)。 - **哈希算法(digestmod)**:如 SHA-256、SM3 等,决定 HMAC 的底层哈希函数。 - **示例(Python)**: ```python import hmac key = b"secret_key" h = hmac.new(key, digestmod='sha256') # 初始化 HMAC 对象 ``` --- ### **2. `update` 方法:分块输入数据** - **作用**: 允许分多次输入待处理的数据(如大文件或流式数据),避免一次性加载全部内容到内存。 - **特性**: - 支持多次调用,按顺序拼接所有输入数据。 - 最终结果等效于一次性处理完整数据。 - **示例(Python)**: ```python # 分块处理数据 h.update(b"Hello, ") h.update(b"world!") mac = h.hexdigest() # 生成最终 HMAC 值 ``` --- ### **3. 完整流程** 1. **初始化**:`init` 绑定密钥哈希算法。 2. **更新数据**:多次调用 `update` 逐步输入数据。 3. **生成结果**:调用 `digest()` 或 `hexdigest()` 输出 HMAC 值。 --- ### **4. 注意事项** - **密钥管理**:密钥需保密且具备足够随机性。 - **哈希算法选择**:优先使用安全算法(如 SHA-256、SM3),避免 MD5 或 SHA-1。 - **顺序敏感**:`update` 的调用顺序必须与实际数据顺序一致,否则结果错误。 --- ### **对比:一次性处理 vs 分块处理** | **方式** | **代码示例** | **适用场景** | |----------------|------------------------------------------|--------------------------| | 一次性处理 | `hmac.new(key, data, digestmod='sha256')` | 数据量小,内存充足 | | 分块处理 | 多次调用 `update()` | 大文件、流式数据或内存受限 | --- ### **总结** - `init`:初始化 HMAC 对象,绑定密钥与算法。 - `update`:分块输入数据,提升处理效率与资源利用率。 - 两者配合使用,可灵活应对不同数据规模的需求,同时保证计算结果的正确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值