2011-07-20 129 views
1

所以顯然我只是不知道如何在Python程序中正確導入東西。我剛開始使用該語言,與我習慣的Java有很大不同。Python導入問題

無論如何,主要的問題是,我如何導入包/模塊/類,有什麼問題,我似乎無法弄清楚它是什麼。

現在我的文件結構如下所示:

-Main Directory 
main.py 
    -Person (Folder) 
     __init__.py 
     Person.py 
     Student.py 

現在我main.py文件的樣子..

from Person import Person 
from Person import Student 

if __name__ == '__main__': 

    p = Person.Person("Jim", 20) 
    print(p) 
    s = Student("Jim", 20, "math") 
    print(s) 

和我不斷收到的TypeError: 'module' object is not callable

有一個錯誤試圖將其更改爲s = Student.Student("Jim", 20, "Math"),但是當發生這種情況時,最終出現錯誤TypeError: module.__init__() takes at most 2 arguments (3 given)

僅供參考,

Person.py:

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

    def __str__(self): 
     return "My name is {0} and I am {1}".format(self.name, self.age) 

Student.py:

from Person import Person 
class Student(Person.Person): 

    def __init__(self, name, age, sub): 
     Person.__init__(self,name,age) 
     self.sub = sub 

不管我做什麼,以進口或什麼,我似乎可以改變,這一切一直給我錯誤。不知道在這一點上應該做什麼 - 也許我只是錯過了創建類和子類時,它顯示給我,但我無法找出任何解決辦法。

+0

看到http://stackoverflow.com/questions/2360724/in-python-what-exactly-does-import-import – mjv

+3

你,如果你在你的模塊使用小寫可能會對此有一個更簡單的時間和大寫在你的類名中。查看命名約定:http://www.python.org/dev/peps/pep-0008/ –

+1

也; Python不是Java。沒有任何理由將每個類放在自己的模塊中; 'person/__init __。py'或'person.py'中定義的'person.Person'和'person.Student'完全合理。 – geoffspear

回答

0

問題出在您的學生課上。這裏,Person指的是Person.py模塊。你應該做調用父對象:

​​

此外,在主要部分,你應該初始化:

s = Student.Student("Jim", 20, "math") 
+0

假設將其更改爲主文件中的那個,我仍然得到相同的'TypeError:模塊.__ init __()最多需要2個參數(給出3個)'error:/ – Ben

+0

你應該使用super(),而不是這個。 – agf

+0

是的。我糾正了我的答案。 –

2

main.py:

from Person import Person 
from Person import Student 

if __name__ == '__main__': 

    p = Person.Person("Jim", 20) 
    print(p) 
    s = Student.Student("Jim", 20, "math") 
    print(s) 

student.py

from Person import Person 

class Student(Person): 

    def __init__(self, name, age, sub): 
     super(Student, self).__init__(name,age) 
     self.sub = sub 

person.py

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

    def __str__(self): 
     return "My name is {0} and I am {1}".format(self.name, self.age) 
+0

按建議更改所有內容,但仍具有相同的TypeError。也許我剛剛創建了不正確的子類? – Ben

+0

OK,reedited to correct,PythonWin實際上並未重新加載更改後的模塊。 'Person Person'應該從對象繼承。 'class Student'應該從Person繼承,並用'super(Student,self).__ init __(name,age)'調用它的構造函數。請注意,在Student.py中,您正在導入一個類,而在main.py中,您正在導入一個模塊。 – agf

+0

終於把它改成'class Student(Person.Peron):'或者從Person.Person import Person更改導入到''PyDev仍然告訴我有什麼地方有錯,但是它有效。 – Ben