150

私はpythonを学ぼうとしていますが、今はクラスのこつとインスタンスでそれらを操作する方法を習得しようとしています。

私はこの練習問題を理解できないようです:

名前、年齢、専攻が入力として与えられたものと同じ学生オブジェクトを作成して返します

def make_student(name, age, major)

オブジェクトの意味がわかりません。これらの値を保持する関数内に配列を作成する必要があるということですか? または、クラスを作成し、この関数をその中に入れて、インスタンスを割り当てますか? (この質問の前に、名前、年齢、専攻を含む学生クラスを設定するように求められました)

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

4 に答える 4

189
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 の哲学の原則の 1 つは「それを行うには 1 つ、できれば 1 つだけの明白な方法があるべきである」ですが、これを行う方法はまだ複数あることに注意してください。次の 2 つのコード スニペットを使用して、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 のようなドキュメント データベースを操作する場合など、後者が役立つ場合もあります。

于 2013-02-26T04:58:29.860 に答える
54

クラスを作成し、__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__

于 2013-02-26T04:51:35.450 に答える
30

オブジェクトはクラスのインスタンスです。クラスは、オブジェクトの単なる設計図です。したがって、クラス定義が与えられた場合-

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

-make_studentの新しいインスタンスに属性を明示的に割り当てることにより、関数を作成できます。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

を使用すると、コンストラクターが呼び出されます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})()
于 2013-02-26T05:05:04.737 に答える