2013-02-26 128 views
83

我正在嘗試學習python,現在我正在嘗試獲取類的竅門以及如何使用實例來操作它們。Python,創建對象

我似乎無法理解這種做法的問題:

創建並返回一個學生對象,其姓名,年齡,以及主要是 同作爲輸入那些

def make_student(name, age, major) 

我只是不要按對象表達它的含義,他們的意思是我應該在保存這些值的函數內部創建一個數組?或者創建一個類並讓這個函數在裏面,並分配實例? (這個問題之前,我被要求建立與姓名,年齡,以及主要內部一個學生類)

class Student: 
    name = "Unknown name" 
    age = 0 
    major = "Unknown major" 
+0

讀取數據模型文檔,特別是'__init__'方法是與此有關:http://docs.python.org/2/reference/datamodel.html#object.__init__ – wim 2013-02-26 04:51:34

+0

無(沒有引號)是python – monkut 2013-02-26 05:00:24

回答

119
class Student(object): 
    name = "" 
    age = 0 
    major = "" 

    # The class "constructor" - It's actually an initializer 
    def __init__(self, name, age, major): 
     self.name = name 
     self.age = age 
     self.major = major 

def make_student(name, age, major): 
    student = Student(name, age, major) 
    return student 

注意的是,在Python的哲學原理,即使一個是「應該有一個和做最好只有一個顯而易見的方式」,仍然有多種方法可以做到這一點。您還可以使用代碼以下兩個片段採取的Python的動態能力的優勢:

class Student(object): 
    name = "" 
    age = 0 
    major = "" 

def make_student(name, age, major): 
    student = Student() 
    student.name = name 
    student.age = age 
    student.major = major 
    # Note: I didn't need to create a variable in the class definition before doing this. 
    student.gpa = float(4.0) 
    return student 

我更喜歡前者,但存在這樣的情況,其中後者可以是有用的 - 一個與文件的數據庫,如MongoDB的工作時, 。

+9

爲什麼在初始化之前將它們初始化爲類變量? (好奇;經常沒有看到這種模式) – GoingTharn 2013-09-21 01:25:48

+2

爲了可讀性目的。通過在init之前將類變量放在頂端附近,我可以很快看到哪些變量在類範圍內,因爲它們可能不是全部由構造函數設置的。 – Wulfram 2013-11-08 00:00:16

+1

這是班級實例的對象的名稱學生將保持學生的權利?如果我想在名稱爲student01,student02等的每次通話中使用多個對象,該怎麼辦? – Yathi 2014-06-18 05:21:28

35

創建一個類,並給它一個__init__方法:

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

    def is_old(self): 
     return self.age > 100 

現在,你可以初始化Student類的一個實例:

>>> s = Student('John', 88, None) 
>>> s.name 
    'John' 
>>> s.age 
    88 

雖然我不知道爲什麼你需要一個make_student學生的功能,如果它做同樣的事情如Student.__init__

+0

中的common * unassigned *默認值我們的老師給了我們一個test.py程序,測試我們是否正確地解決了這些問題。這個問題要我專門使用make_student函數。最終目標是: s1 = make_student(姓名,年齡,主修) 現在我已將所有內容都分配給了s1。但我不知道他們想要s1是什麼?我可以用一個數組{{name':name..etc}來做到這一點,但是這並沒有給我一個正確的答案,所以我假設我需要實現我從類和實例中學到的東西 – 2013-02-26 05:03:04

+0

所謂的「工廠方法「模式,使用方法或函數來創建某種對象而不是直接在代碼中創建對象的模式是一種有用的模式,它允許您利用有關繼承的優點,例如。查看它;) – bracco23 2016-11-01 20:34:47

10

對象是類的實例。類只是對象的藍圖。因此,考慮你的類定義 -

# Note the added (object) - this is the preferred way of creating new classes 
class Student(object): 
    name = "Unknown name" 
    age = 0 
    major = "Unknown major" 

您可以明確地分配屬性的Student一個新實例創建make_student功能 -

def make_student(name, age, major): 
    student = Student() 
    student.name = name 
    student.age = age 
    student.major = major 
    return student 

但它可能更有意義爲此在構造函數(__init__) -

class Student(object): 
    def __init__(self, name="Unknown name", age=0, major="Unknown major"): 
     self.name = name 
     self.age = age 
     self.major = major 

當您使用調用構造函數。它將採用__init__方法中定義的參數。構造函數簽名現在基本上是Student(name, age, major)

如果使用,那麼make_student功能是微不足道的(和多餘的) -

def make_student(name, age, major): 
    return Student(name, age, major) 

爲了好玩,這裏是如何在不定義類創建make_student功能的例子。請不要在家裏嘗試。

def make_student(name, age, major): 
    return type('Student', (object,), 
       {'name': name, 'age': age, 'major': major})() 
+0

實際上,我寧願不要做類名(對象):爲了冗長的原因。 Python文檔往往不會這麼做。儘管我喜歡用字典的「危險」例子。 http://docs.python.org/2/tutorial/classes.html – Wulfram 2013-02-26 05:07:56

+0

我撤回以前的評論。請參閱http://stackoverflow.com/questions/4015417/python-class-inherits-object。所以實際上有個理由說出類名(object): – Wulfram 2013-02-26 05:12:47

+1

python中沒有構造函數:) – BigSack 2014-01-13 09:04:51