为什么是python';s getattr(obj,';方法';)和obj.method给出不同的结果?括号是如何影响的?

为什么是python';s getattr(obj,';方法';)和obj.method给出不同的结果?括号是如何影响的?,python,hashlib,getattr,Python,Hashlib,Getattr,我的程序只计算了sha256文件哈希,我决定扩大可能的算法数量。所以我开始使用getattr()代替直接调用。散列已经改变了 我花了一段时间才弄清楚问题出在哪里,下面是一个字符串的简单示例(区别在于()): 有人能解释一下为什么hash1和hash3不相等吗? 我错过smth了吗?因为对我来说,它们看起来是一样的: >>> print(hash1) <sha256 HASH object @ 0x0000027D76700F50> >>> prin

我的程序只计算了sha256文件哈希,我决定扩大可能的算法数量。所以我开始使用
getattr()
代替直接调用。散列已经改变了

我花了一段时间才弄清楚问题出在哪里,下面是一个字符串的简单示例(区别在于
()
):

有人能解释一下为什么hash1和hash3不相等吗? 我错过smth了吗?因为对我来说,它们看起来是一样的:

>>> print(hash1)
<sha256 HASH object @ 0x0000027D76700F50>
>>> print(hash2())
<sha256 HASH object @ 0x0000027D76FD7470>
>>> print(hash3)
<sha256 HASH object @ 0x0000027D76D92BF0>

>>> print(type(hash1))
<class '_hashlib.HASH'>
>>>print(type(hash2()))
<class '_hashlib.HASH'>
>>>print(type(hash3))
<class '_hashlib.HASH'>
打印(哈希1) >>>打印(hash2()) >>>打印(哈希3) >>>打印(类型(哈希1)) >>>打印(键入(hash2()) >>>打印(类型(哈希3)) 事实上,
getattr(obj,'method')
obj.method
给出了相同的结果,但在案例2中,您使用的是错误的

调用函数
hashlib.sha256
时,它会返回一个新的哈希对象,这就是在案例1和案例3中处理的对象。但是,在第2种情况下,
hash2
是函数
hashlib.sha256
,而不是散列对象,以后调用时不会改变,这意味着:

  • 执行
    hash2().update(text)
    时,结果将被丢弃
  • 执行
    hash2().hexdigest()
    时,结果与
    hashlib.sha256().hexdigest()
    相同,即为空哈希
作为比较,案例2实际上与此相同:

>>> list().append(0)  # Create new list object and append 0
>>> list()  # Create new list object
[]

提示:什么是hashlib.sha256().hexdigest()?既然你在#3中找到了解决方案,答案就包含在问题中-你得到了不同的结果,因为在#2中你创建了两个不同的散列对象,你用数据更新了一个,从另一个(没有收到数据)那里得到了摘要。既然你找到了答案,我对你的问题标题感到惊讶——你的#1和#3正在比较
getattr(obj,'method')()
obj.method()
,它们给出了相同的结果,而你的#1和#2正在比较
getattr(obj,'method')
(没有调用)和
obj.method()
(有调用)。你从来没有在没有电话的情况下比较过
getattr(obj,'method')
obj.method
。对不起,我试着提出这个问题,但这是我最好的办法,没有把标题写得像帖子一样长。哦,原来有两个不同的物体,看起来就是它。谢谢你的回答!但是为什么我得到了hashsum2?对于特定的文件总是一样的。@Sidov什么是
hashsum2
hash2().hexdigest()
@Sidov正如我所解释的,
hash2
hashlib.sha256
,所以“当你做
hash2().hexdigest()
,结果与
hashlib.sha256().hexdigest()
,即空哈希相同。”噢,这与使用空文件得到的值相同。在我的语言中,它有另一个名字,而我一开始并没有弄明白。非常感谢。
>>> list().append(0)  # Create new list object and append 0
>>> list()  # Create new list object
[]