python hasattr()来区分方法和属性

时间:2018-01-03 03:39:01

标签: python oop

正如一些好人告诉我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(),属性和方法都会显示在输出中,而你无法确定哪一个属于哪种类型。

有人可以解释一下为什么吗?

3 个答案:

答案 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'>

也许这可以判断它是否是一种方法?