2013-02-26 22 views
83

Ich versuche, Python zu lernen, und ich versuche jetzt, den Hang der Klassen zu bekommen und sie mit Instanzen zu manipulieren.Python, Erstellen von Objekten

Ich kann diese Praxis Problem zu verstehen scheinen:

erstellen und ein Student-Objekt, dessen Name, Alter zurückkehren, und die wichtigsten sind die gleichen wie die als Eingabe gegeben

def make_student(name, age, major) 

ich nur verstehe nicht, was es mit dem Objekt meint, meinen sie, ich sollte innerhalb der Funktion, die diese Werte enthält, ein Array erstellen? oder erstellen Sie eine Klasse und lassen Sie diese Funktion drin und weisen Sie Instanzen zu? (Vor dieser Frage wurde ich gebeten, einen Schüler-Klasse mit dem Namen einzurichten, Alter und Haupt innen)

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

Datenmodell docs lesen, insbesondere die '__init__' Methode hier relevant ist: http://docs.python.org/2/reference/datamodel.html#object.__init__ – wim

+0

None (ohne Anführungszeichen) ist der gemeinsame * nicht zugewiesene * Standardwert in Python – monkut

Antwort

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 

Beachten Sie, dass auch wenn eines der Prinzipien in der Philosophie Python ist „sollte es ein und vorzugsweise nur eine offensichtliche Art und Weise, es zu tun“, gibt es noch mehrere Möglichkeiten, dies zu tun. Sie können auch die beiden folgenden Code-Schnipsel verwenden Vorteil von Pythons dynamischen Fähigkeiten zu nehmen:

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 

ziehe ich die ehemalige, aber es gibt Fälle, in denen diese nützlich sein kann - ein Wesen, wenn sie mit Dokument-Datenbanken wie MongoDB Arbeits .

+9

Warum initialisierst du sie als Klassenvariablen vor deiner init? (neugierig; habe dieses Muster nicht oft gesehen) – GoingTharn

+2

Aus Lesbarkeitsgründen. Indem ich die Klassenvariablen vor der Initialisierung in die Nähe des oberen Bereichs setze, kann ich schnell erkennen, welche Variablen sich im Klassenbereich befinden, da sie möglicherweise nicht alle vom Konstruktor festgelegt werden. – Wulfram

+1

Hier wird der Name des Objekts, das die Instanz der Klasse Student ist, Student bleiben, oder? Was passiert, wenn ich bei jedem Aufruf mehrere Objekte mit dem Namen student01, student02, .. und so weiter möchte? – Yathi

35

Erstellen Sie eine Klasse und geben ihm eine __init__ Methode:

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 

Jetzt können Sie eine Instanz der Klasse Student initialisieren:

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

Obwohl ich nicht sicher bin, warum Sie eine make_student Student Funktion benötigen, wenn sie die gleiche Sache tut als Student.__init__.

+0

Unser Lehrer gab uns ein test.py Programm, das prüft, ob wir die Probleme richtig gemacht haben. Die Frage will, dass ich speziell die Funktion make_student benutze. Das Endziel ist: s1 = make_student (Name, Alter, Major) und jetzt habe ich alles s1 zugewiesen. Aber ich bin mir nicht sicher, was sie wollen? Ich kann dies mit einem Array tun {'name': name..etc}, aber das gab mir keine richtige Antwort, also gehe ich davon aus, dass ich implementieren muss, was ich von Klassen und Instanzen gelernt habe –

+0

Die sogenannte "Factory-Methode "Muster, das, wo Sie eine Methode oder eine Funktion verwenden, um ein Objekt zu erstellen, anstatt es direkt im Code zu erstellen, ist ein nützliches Muster, mit dem Sie beispielsweise schöne Dinge über die Vererbung ausnutzen können. Schau es dir an;) – bracco23

10

Objekte sind Instanzen von Klassen. Klassen sind nur die Blaupausen für Objekte. So Ihre Klassendefinition gegeben -

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

Sie können explizit die Zuordnung der Attribute einer neuen Instanz von Student eine make_student Funktion erstellen -

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

Aber es macht wahrscheinlich mehr Sinn dies in einem Konstruktor zu tun (__init__) -

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

Der Konstruktor aufgerufen wird, wenn Sieverwenden. Es nimmt die Argumente an, die in der __init__ Methode definiert werden. Die Konstruktorsignatur wäre jetzt im Wesentlichen Student(name, age, major).

Wenn Sie diese verwenden, dann eine make_student Funktion ist trivial (und überflüssig) -

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

Für Spaß, hier ist ein Beispiel dafür, wie ohne Definition einer Klasse eine make_student Funktion zu erstellen. Bitte versuchen Sie das nicht zu Hause.

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

Eigentlich bevorzuge ich Klasse Name (Objekt) zu tun: aus Gründen der Ausführlichkeit. Die Python-Dokumentation neigt dazu, es nicht so gut zu machen. Ich mag das "gefährliche" Beispiel eines Diktats. http://docs.python.org/2/tutorial/classes.html – Wulfram

+0

Ich ziehe meinen vorherigen Kommentar zurück. Siehe http://stackoverflow.com/questions/4015417/python-class-inherits-object. Es gibt also einen Grund, die Klasse Name (Objekt) zu formulieren: – Wulfram

+1

Es gibt keinen Konstruktor in Python :) – BigSack

Verwandte Themen