如何在没有异常的情况下检查类成员是否存在

时间:2013-07-11 10:54:26

标签: python

对于基本类型,我可以使用if in:boolean check。但是如果我使用in语法来检查类成员的存在,我会得到一个NameError异常。有没有办法在Python中检查没有异常?或者是尝试除了块之外的唯一方法吗?

这是我的示例代码。

class myclass:
    i = 0
    def __init__(self, num):
        self.i = num

mylist = [1,2,3]
if 7 in mylist:
    print "found it"
else:
    print "7 not present"  #prints 7 not present


x = myclass(3)
print x.i       #prints 3

#below line NameError: name 'counter' is not defined
if counter in x:
    print "counter in x"
else:
    print "No counter in x"

4 个答案:

答案 0 :(得分:5)

您可以使用hasattr

if hasattr(x, 'counter'):
    # whatever

答案 1 :(得分:4)

您得到的错误是因为您使用的是counter(名称)而不是'counter'(字符串)。但是,即使您使用'counter'它也不会达到预期效果,您将获得TypeError: argument of type 'a' is not iterable - 也就是说您无法迭代自定义对象。

相反,请使用实例的__dict__属性:

>>> class A(object):
...     i = 0
...     def __init__(self, num):
...         self.i = num
...
>>> x = A(3)
>>> x.i
3
>>> 'i' in x.__dict__
True
>>> 'counter' in x.__dict__
False

或者Jon指出的更合适的hasattr

>>> hasattr(x, 'counter')
False
>>> hasattr(x, 'i')
True

答案 2 :(得分:1)

您可以在班级中创建__contains__函数,该函数使用in运算符报告班级中的属性。

class myclass:

    def __init__(self, num):
        self.i = num

    def __contains__(self, attribute_name):
        return hasattr(self, attribute_name)

然后(几乎)和你的代码一样好用。

x = myclass(3)
print x.i       #prints 3

# prints 'No counter in x'
if 'counter' in x:
    print "counter in x"
else:
    print "No counter in x"

请注意,您需要传递属性名称的字符串,而不是属性本身。

答案 3 :(得分:0)

您问题的正确答案取决于您在对象中存在的成员的含义。如果您的意思是,在给定对象上存在实例变量,请使用hasattr,如其他答案所解释的那样。

但是,如果您要创建自己的集合类型并想要检查其内容中的特定值,那么您将希望为您的类提供__contains__方法。调用该魔术方法来实现in运算符。这是一个简单的例子,我只是在我自己的对象中包含一个列表。

class MyListWrapper(object):
    def __init__(self, iterable=[]):
        self.list = list(iterable)

    def __contains__(self, value):
        return value in self.list

测试环节:

>>> m = MyListWrapper(["foo", "bar"])
>>> "foo" in m
True