正如一些好人告诉我callable()
可以用来解决这个问题,我仍然觉得这是一个不同的问题,因为任何有这个问题的人都不会找到答案,因为他赢了'将此直接连接到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()
确实在True
,'attr1'
,'attr2'
上对我的所有'meth1'
进行了测试。它不区分属性或方法。
如果我使用dir()
,属性和方法都会显示在输出中,而你无法确定哪一个属于哪种类型。
有人可以解释一下为什么吗?
答案 0 :(得分:3)
无论是变量还是方法,它们都被视为"属性"。因此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
答案 1 :(得分:1)
您可以将<div class="box">
<div class="left">Left</div>
<div class="right">Right 250px</div>
<div class="leftTop">Left Top Layer</div>
<div class="rightTop">Right Top Layer</div>
</div>
定义如下
hasmethod()
答案 2 :(得分:0)
我发现有趣的是,如果我在属性上调用type()
,方法将显示为方法,而属性将是字符串或int或任何其他类型。
print(type(obj.attr1)) # >>> <class 'str'>
print(type(obj.attr2)) # >>> <class 'str'>
print(type(obj.meth1)) # >>> <class 'method'>
也许这可以判断它是否是一种方法?