2013-09-28 94 views
1

以下代碼僅在註釋掉初始化程序時纔有效。Python類無法看到方法,除非我註釋掉__init__

class What: 
    def __init__(self): 
     pass 

    def method1(self): 
     print 'method1' 

def main(): 
    b = What() 

    if hasattr(b,"method1"): 
     print "b.method1" 

    b.method1() 

main() 

如果它沒有被註釋掉我得到錯誤信息......

Traceback (most recent call last): 
    File "strange.py", line 17, in <module> 
    main() 
    File "strange.py", line 15, in main 
    b.method1() 
AttributeError: What instance has no attribute 'method1' 

但是,如果我以相同的方法類型,並調用它,也一點問題都沒有......

def method2(self): 
     print 'method2' 

我使用了od -c文件,文本中沒有奇怪的字符 使用Python 2.7.2

+1

還有其他事情正在發生,因爲這工作正常,正如預期的那樣。 – sberry

+1

也許你在混合標籤和空格? – sberry

+1

@sberry正確。我用Python 2.7.3測試了它,它工作正常。 – 2013-09-28 05:26:33

回答

5

我認爲你在混合標籤和空格。

使用每個縮進4個空格(符合pep8的空格)的代碼,它工作正常。但是,這是

class What: 
    def __init__(self): 
     pass 

     def method1(self): 
      print 'method1' 

def main(): 
    b = What() 

    if hasattr(b,"method1"): 
     print "b.method1" 

    b.method1() 

main() 

是什麼Python會看到,如果你有方法1的選項卡,這會產生你看到的錯誤。

+0

我正要回答這個問題。如果您檢查OP已經粘貼到SO中的代碼,則會混合使用製表符和空格。好決定! – 2013-09-28 05:29:02

+0

@LegoStormtroopr:我甚至沒有意識到SO代碼粘貼保留了標籤。很高興知道,並確認。 – sberry

+0

另外,'def method1'意思是縮進到目前爲止?它現在在'__init__'塊中。 – 2013-09-28 05:31:09