如何找出对象是否具有属性?

时间:2011-11-09 16:51:07

标签: python

 if groupName.group == "None":

错误:

AttributeError: 'NoneType' object has no attribute 'group'

如何检查对象是否有属性?

5 个答案:

答案 0 :(得分:8)

您想要getattr(),您可以传递默认值,或hasattr()

答案 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