gpt4 book ai didi

python hasattr() 区分方法和属性

转载 作者:太空宇宙 更新时间:2023-11-03 14:47:51 27 4
gpt4 key购买 nike

正如一些优秀的人告诉我 callable() 可以用来解决这个问题,我仍然发现这是一个不同的问题,因为任何想到这个问题的人都不会找到answer 因为他不会直接把它连接到 callable()。另外,我找到了一种不使用 callable() 的可行方法,即使用 type(),如我自己的一个答案所示。

假设我创建了一个简单的类 Cls

class Cls():
attr1 = 'attr1'

def __init__(self, attr2):
self.attr2 = attr2

def meth1(self, num):
return num**2

obj = Cls('attribute2')
print(hasattr(obj, 'attr1')) # >>> True
print(hasattr(obj, 'attr2')) # >>> True
print(hasattr(obj, 'meth1')) # >>> True

据我了解,属性是类内部的变量,方法是类内部的函数。它们不一样。

显然,python 没有调用hasmethod()。似乎 hasattr() 确实为我在 'attr1''attr2' 上的测试提供了所有 True , 'meth1'。它不区分属性或方法。

如果我使用 dir(),属性和方法将全部显示在输出中,您也无法真正分辨出哪个是什么类型。

谁能解释一下为什么?

最佳答案

无论是变量还是方法,都被认为是“属性”。所以 hasattr 返回 True

方法的不同之处在于它们是可调用的。这可以通过调用 callable 来检查。所以如果你想弄清楚一个属性是否是可调用的,你可以

if hasattr(obj, "attr1"):
if callable(obj.attr1):
# attr1 is a method!
else:
# attr1 is not a method but an attribute
else:
# attr1 is not an attribute

关于python hasattr() 区分方法和属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48070833/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com