对于基本类型,我可以使用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"
答案 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