2014-01-27 16 views
0

我寫了下面的python代碼,並嘗試使用__main__來初始化兩個類對象,但運行python classPerson.py時出現以下錯誤。我想知道在python中初始化類對象的正確方法是什麼。Python:是執行的入口點(__main__)?

Person(object): 
    def __init__(self, name, salary): 
     self.name = name 
     self.salary = salary 


    def getName(): 
     return self.name 

    def getSalary(): 
     return self.salary 

    if __name__ == '__main__': 
     bob = Person('Bob Smith', 40000) 

     sue = Person('Sue Funk', 35000) 

     print 'bob makes a salary of %d' % (bob.getSalary) 
     print 'sue's full name is %s' % (sue.getName) 

錯誤:

Traceback (most recent call last): 
    File "classTest1.py", line 1, in <module> 
    class Person(object): 
    File "classTest1.py", line 14, in Person 
    bob = Person('Bob Smith', 40000) 
NameError: name 'Person' is not defined 
+0

你的代碼是無效的,因爲貼了,因爲最後一個字符串將不編譯(單引號括起來的值與非轉義的單引號中它)。 –

回答

2

你太遠縮進if __name__ == "__main__"塊的一個水平。嘗試運行

class Person(object): 
    def __init__(self, name, salary): 
     self.name = name 
     self.salary = salary 


    def getName(self): 
     return self.name 

    def getSalary(self): 
     return self.salary 

if __name__ == '__main__': 
    bob = Person('Bob Smith', 40000) 
    sue = Person('Sue Funk', 35000) 
    print 'bob makes a salary of %d' % (bob.getSalary()) 
    print "sue's full name is %s" % (sue.getName()) 

因爲在你的代碼中,if塊處於Person類和類是建立之前你製作的類的對象,這是給你一個錯誤。

+0

哇,你們快!非常感謝你!你們提醒我在Python中壓縮的重要性! :)欣賞它。 – TonyGW

+0

代碼還有幾個問題:看到我的答案是解決Sukrit尚未解決的另一個問題。 :-) –

+0

不能相信我錯過了Martijn!將立即在代碼中修復它。謝謝。 :) –

4

您需要取消縮進if __name__Person類的一部分。

它正在執行太早,Person類仍在建造當時。

通過將其縮進到與Person類主體中的方法相同的級別,您已經完成了類定義的測試部分。它正在被執行,因爲該類仍在被定義,所以Person類的引用不存在。

更正代碼:

class Person(object): 
    def __init__(self, name, salary): 
     self.name = name 
     self.salary = salary 

    def getName(self): 
     return self.name 

    def getSalary(self): 
     return self.salary 

if __name__ == '__main__': 
    bob = Person('Bob Smith', 40000) 

    sue = Person('Sue Funk', 35000) 

    print 'bob makes a salary of %d' % (bob.getSalary()) 
    print "sue's full name is %s" % (sue.getName()) 

注:

  1. 還需要呼叫getSalary()getName()方法。
  2. 給所有方法一個self參數。
  3. 爲您的字符串使用正確的引用(sue's包含單引號,最好使用雙引號來分隔該字符串)。
+0

根據[PEP-8](http://www.python.org/dev/peps/pep-0008/),這些方法應該命名爲'get_name'和'get_salary'。 – Matthias

+0

@Matthias:我不會爲新手命名約定而挑剔。這一切都可以晚一點。 –

+0

這就是爲什麼我添加它作爲評論,並沒有嘗試寫出自己的答案。 – Matthias

4

不能使用Person類定義它,而你必須把它放在一個縮進級別下降

class Person(object): 
    def __init__(self, name, salary): 
     self.name = name 
     self.salary = salary 


    def getName(self): 
     return self.name 

    def getSalary(self): 
     return self.salary 

if __name__ == '__main__': 
    bob = Person('Bob Smith', 40000) 

    sue = Person('Sue Funk', 35000) 

    print 'bob makes a salary of %d' % (bob.getSalary()) 
    print "sue's full name is %s" % (sue.getName()) 

編輯糾正根據Sukrit卡爾拉評論

編輯最後一條語句調用方法的正確方法是使用括號,並且正確的方式來定義它是使用self中的參數,但是使用類的慣用方式是是不使用getter和setter所以

class Person(object): 
    def __init__(self, name, salary): 
     self.name = name 
     self.salary = salary 


if __name__ == '__main__': 
    bob = Person('Bob Smith', 40000) 

    sue = Person('Sue Funk', 35000) 

    print 'bob makes a salary of %d' % (bob.salary) 
    print "sue's full name is %s" % (sue.name) 

python is not java!

+0

檢查最後一個'print'語句。 :) –

+0

@SukritKalra我改正了它 –

+0

還有更多的問題;你需要注意這些方法是如何工作的(提示:調用它們將是一個開始,給這些方法提供正確的參數也有幫助)。 –

相關問題