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