if groupName.group == "None":
错误:
AttributeError: 'NoneType' object has no attribute 'group'
如何检查对象是否有属性?
答案 0 :(得分:8)
答案 1 :(得分:5)
错误消息告诉您groupName
本身是None
。
在这种情况下,测试它是否具有特定属性几乎没有意义。
所以你可能想要更像的东西:
If groupName is not None:
print groupName.group
或者,如果groupName
个对象可能没有group
属性:
If groupName is not None:
print getattr(groupName, 'group', None)
(注意:getattr
的最后一个参数是一个默认值,可以是你想要的任何东西。)
答案 2 :(得分:2)
Python遵循EAFP的座右铭,因此声称它只是尝试处理异常的更好的样式。
所以试试
try:
gr = groupName.group
except AttributeError:
complain()
else:
if gr == "None":
go_on()
但要注意:我不确定你的== "None"
是否是你想要的。也许is None
会是......
答案 3 :(得分:2)
这取决于你所谓的“有一个属性”。
hasattr()
如果您想验证表达式X.a
是否会返回某些内容或引发错误,您可以使用hasattr()
def f(x,y):
return x+y
f.a = 'suming function'
print "hasattr(f,'a') : ",hasattr(f,'a'),' f.a : ',f.a
print "hasattr(f,'sdjk') : ",hasattr(f,'sdjk'),' f.sdjk : ',f.sdjk
产生
hasattr(f,'a') : True f.a : suming function
hasattr(f,'sdjk') : False f.sdjk :
Traceback (most recent call last):
File "I:\all\aaaaa.py", line 26, in <module>
print "hasattr(f,'sdjk') : ",hasattr(f,'sdjk'),' f.sdjk : ',f.sdjk
AttributeError: 'function' object has no attribute 'sdjk'
__dict__
但是可能会发生这样的情况:在具有特定名称的实例上调用属性会返回一些内容,而实例的命名空间中实际上没有这个名称,也就是说在此字典中没有项name:object
实例的属性。
具有类属性的情况:当在类的一个实例上完成对其名称的调用时返回类属性,而该名称在实例的名称空间中不存在。见例:
class Tomo:
count = 0
def __init__(self):
Tomo.count += 1
pass
ti = Tomo()
ta = Tomo()
tu = Tomo()
ty = Tomo()
print 'ty.count ==',ty.count," hasattr(ty,'count') ==",hasattr(ty,'count')
print 'ty.__dict__ ==',ty.__dict__," 'count' in ty.__dict__ ==",'count' in ty.__dict__
print
结果
ty.count == 4 hasattr(ty,'count') == True
ty.__dict__ == {} 'count' in ty.__dict__ == False
因此
hasattr(ty,'count')
说“是”
虽然'count' in ty.__dict__
说“不,但是没有属性计数”。
然后,询问hasattr(object,name)
对程序中真实对象状态的回答不如提问name in object.__dict__
,尽管 hasattr()提供有关数据处理的更多相关信息,这是运行程序的实际目标。
因此,我认为使用hasattr()
与算法相关联,并且__dict__
的使用与理解正在运行的程序的基础机制相关联。
理论上dir(object)
给出了对象的词典__dict__
的键。
但
dir([object])不带参数,返回名称列表 当前的本地范围。使用参数,尝试返回列表 该对象的有效属性。如果对象没有提供
__dir__()
,函数尽力从对象中收集信息__dict__
属性,如果已定义,,则来自其类型对象
因此,dir()
与hasattr()
存在同样的问题:它提供的属性多于唯一完全在对象中而不在其父类中的属性。
顺便说一句,我认为如果你这样做会好的:
if hasattr(groupName,'group') and groupName.group is None:
..........
.....
........
据说最好使用is
测试无==
答案 4 :(得分:1)
在python中有一句座右铭:最好是对不起而不是问问权限。我建议找出你的需求,并最终做一些事情:
try:
# do something with groupName.group
except SomeException, e: ...
# act some other way