2013-02-26 8 views
83

私はPythonを学ぼうとしていますが、今はクラスのハングアップとインスタンスを使ってそれらを操作する方法を試しています。オブジェクトを作成するPython

私はこの練習問題を理解するように見えることはできません。

その名前、年齢、および主要いる 入力

def make_student(name, age, major) 

として与えられたものと同じ学生のオブジェクトを作成し、返す私はちょうどオブジェクトによって何を意味するのかを知りません。つまり、これらの値を保持する関数の内部に配列を作成する必要がありますか?クラスを作成して、この関数をその内部に入れ、インスタンスを割り当てますか?今

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 

、あなたがすることができます

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

、データモデルのドキュメントを読んで、具体的 '__init__'方法はここでは関係あり:http://docs.python.org/2/reference/datamodel.html#object.__init__ – wim

+0

なし(引用符なし)されますPythonのcommon * unassigned *のデフォルト値 – monkut

答えて

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の動的機能を利用するには、コードの2次スニペットを使用することができます。

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

initの前にクラス変数として初期化するのはなぜですか? (好奇心が強い;そのパターンを頻繁に見ていない) – GoingTharn

+2

読みやすくするため。クラス変数をinitの前に置くことで、どの変数がコンストラクタによってすべて設定されるわけではないので、どの変数がクラススコープにあるのかを素早く確認できます。 – Wulfram

+1

ここで、クラスのインスタンスであるオブジェクトの名前は、学生権利のままになりますか? student01、student02、...という名前の各呼び出しで複数のオブジェクトが必要な場合はどうなりますか? – Yathi

35

クラスを作成し、それを__init__方法を与える(この質問の前に、私は名前、年齢、および主要な内部での学生のクラスを設定するように頼まれました) Studentクラスのインスタンスを初期化します。

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

それは同じことをやっている場合、あなたがmake_student学生の機能を必要とする理由私はよく分からないが、 Student.__init__となります。 Pythonの哲学の原則の一つはある「1-、それを行うには、好ましくは、一つだけ、明白な方法があるはず」もかかわらず、これを行うための複数の方法がまだあることを

+0

私たちの先生は問題を正しく実行したかどうかをテストするtest.pyプログラムを教えてくれました。質問は私に、特にmake_student関数を使うことを望んでいます。最終目標は: s1 = make_student(名前、年齢、メジャー) と今私はすべてs1に割り当てられている。しかし、もう一度私は彼らが何をしたいのか分からないのですか?私は配列{'name':name..etc}でこれを行うことができますが、それは私にクラスとインスタンスから学んだことを実装する必要があると仮定しているので、私に正しい答えを与えませんでした –

+0

いわゆる "factory method "パターン、メソッドや関数を使用してコード内で直接作成するのではなく、ある種のオブジェクトを作成するパターンは便利なパターンです。たとえば、継承に関する素晴らしいことを利用できます。 Look up;) – bracco23

10

オブジェクトはクラスのインスタンスです。クラスは単なるオブジェクトの青写真です。あなたが明示的にStudentの新しいインスタンスに属性を割り当てることによってmake_student関数を作成することができます

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

- - だからあなたのクラス定義が与えられた

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 

コンストラクタが呼び出されStudent()__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

+0

私は前のコメントを撤回します。 http://stackoverflow.com/questions/4015417/python-class-inherits-objectを参照してください。したがって、実際にはクラスName(オブジェクト)を書き出す理由があります: – Wulfram

+1

Pythonにコンストラクタがありません:) – BigSack

関連する問題