我正在尝试验证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)
但是没有更柔软的方法吗?
答案 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