2013-07-11 20 views
0

對於基本類型,我可以使用if in:布爾檢查。但是如果我使用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

的複製http://stackoverflow.com/questions/843277/how-do-i-check-if-a-variable-exists-in-python – Regenschein

+0

@fordprefect雖然它可能是重複的,但它不是該問題的重複。這是關於對象屬性的,這個問題是關於局部和全局變量的。 – delnan

回答

3

你得到的錯誤是因爲您使用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 

或者像喬恩指出更合適hasattr

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

您可以使用hasattr

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

你可以在你的類,它報告回什麼屬性都在使用in操作類進行__contains__功能。

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" 

請注意,您需要傳遞屬性名稱的字符串,而不是屬性本身。

+0

您的想法很有趣,但我認爲直接使用hasattr會更容易。我不知道hasattr –

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 
相關問題