有没有办法确定python对象是否具有属性?

有没有办法确定python对象是否具有属性?,python,Python,我试图验证python对象是否在其方法的定义中包含属性,下面是一些需要澄清的代码: A类: 定义初始化(自): 自我评价a=5 def hasAttr(自身): 如果hasattr(self,“\uu a”): 打印(真) 其他: 打印(假) 如果我执行代码 x = A() x.hasAttr() 我得到False,我知道它不起作用的原因是该属性实际上是私有的,但我不打算访问类外的属性,我只想验证该属性是否已定义,我知道我可以始终使用: A类: 定义初始化(自): 自我评价a=5 def h

我试图验证python对象是否在其方法的定义中包含属性,下面是一些需要澄清的代码:

A类:
定义初始化(自):
自我评价a=5
def hasAttr(自身):
如果hasattr(self,“\uu a”):
打印(真)
其他:
打印(假)
如果我执行代码

x = A()
x.hasAttr()
我得到
False
,我知道它不起作用的原因是该属性实际上是私有的,但我不打算访问类外的属性,我只想验证该属性是否已定义,我知道我可以始终使用:

A类:
定义初始化(自):
自我评价a=5
def hasAttr(自身):
如果在self中有(“+self.\uuuuuu class.\uuuuuu.\uuuuuuu name.\uuuuuuuuu+”\uuuuuuuu a')。\uuuuuuuuu dict\uuuuuuuuuuuuuuuuuuuuuuuu
打印(真)
其他:
打印(假)

但是,难道没有一种更温和的方法来做这件事吗

双下划线变量将类名添加到方法前面,因此
\uuuuA
变成了正确识别的
\uA\uuA
,因此在第一种情况下得到
False

类似地,在第二种情况下,您也可以执行hasattr(self,'.''.+self.'.'.'.''.'.'.''.'.''.''.'.''.''.'名称'.'''.'''.''.'''.''.'''.'.'.'''.'代码'

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

您可以使用
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

hasattr
是这样工作的:
如果hasattr(self,'.''.+self.''.'类'.''.'名'.''.''.'''.'名'.'''.''''.'名'.''''.'''''.'''''''.'a'):
是的,我同意,只是我认为可能有更好的方法,我还不知道。如果你想要更好的方法的话,dunder变量的名字总是被弄错了,也许不定义dunder变量是个好主意@AyoubZAROUI我想我会坚持你刚才给出的解决方案,谢谢你的帮助