有没有一种方法来查找python对象是否具有属性?

时间:2019-06-09 13:25:46

标签: python

我正在尝试验证python对象在其方法之一的定义内是否具有属性,下面是一些代码来阐明:

class A :
    def __init__(self) : 
        self.__a = 5
    def hasAttr(self) : 
        if hasattr(self, '__a'):
            print(True)
        else : 
            print(False)

如果我执行代码

x = A()
x.hasAttr()

我得到False,我知道它不起作用的原因是该属性实际上是私有的,但是我无意访问类之外的属性,我只想验证是否属性尚未定义,我知道我可以随时使用:

class A :
    def __init__(self) : 
        self.__a = 5
    def hasAttr(self) : 
        if ('_'+self.__class__.__name__ + '__a') in self.__dict__:
            print(True)
        else : 
            print(False)

但是没有更柔软的方法吗?

2 个答案:

答案 0 :(得分:3)

双下划线变量是name mangled在方法前面添加类名,因此__a变成_A__a,如您所正确识别的,因此您在第一个得到False情况。

类似地,您可以在第二种情况下执行hasattr(self, '_'+self.__class__.__name__ + '__a')

class A :

    def __init__(self) :
        self.__a = 5

    def hasAttr(self) :

        attr_name = f'_{self.__class__.__name__}__a'
        if hasattr(self, attr_name):
            print(True)
        else :
            print(False)

x = A()
x.hasAttr()

或者您可以使用EAFP方法尝试访问变量,并相应地打印True或False

class A :

    def __init__(self) :
        self.__a = 5

    def hasAttr(self):

        attr_name = f'_{self.__class__.__name__}__a'
        try:
            getattr(self, attr_name)
            print(True)
        except:
            print(False)

x = A()
x.hasAttr()

输出将为True

答案 1 :(得分:1)

您可以使用AttributeError异常来测试是否具有属性:

class A :
    def __init__(self) :
        self.__a = 5
    def hasAttr(self):
        try:
            self.__a
            return True
        except AttributeError:
            return False

x = A()
print(x.hasAttr())

打印:

True