Próbuję nauczyć się Pythona, a teraz próbuję opanować klasy i manipulować nimi za pomocą instancji.
Wydaje się, że nie rozumiem tego problemu:
Utwórz i zwróć obiekt studenta, którego imię i nazwisko, wiek i kierunek są takie same jak te podane jako dane wejściowe
def make_student(name, age, major)
Po prostu nie rozumiem, co to oznacza przez obiekt, czy oznaczają one, że powinienem utworzyć tablicę wewnątrz funkcji, która przechowuje te wartości? czy utworzyć klasę i pozwolić tej funkcji być wewnątrz niej i przypisać instancje? (przed tym pytaniem poproszono mnie o utworzenie klasy studenckiej z podaniem imienia i nazwiska, wieku i specjalności)
class Student:
name = "Unknown name"
age = 0
major = "Unknown major"
__init__
metoda jest odpowiednia tutaj: docs.python.org/2/reference/datamodel.html#object.__init__Odpowiedzi:
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
Zauważ, że chociaż jedną z zasad filozofii Pythona jest „powinien istnieć jeden - a najlepiej tylko jeden - oczywisty sposób na zrobienie tego” , wciąż istnieje wiele sposobów, aby to zrobić. Możesz także użyć dwóch poniższych fragmentów kodu, aby skorzystać z dynamicznych możliwości Pythona:
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
Wolę tę pierwszą, ale są przypadki, w których ta druga może być przydatna - na przykład podczas pracy z bazami danych dokumentów, takimi jak MongoDB.
źródło
class Unicorn
ihas_hooves = True
zamiastname = ""
.Utwórz klasę i nadaj jej
__init__
metodę: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
Teraz możesz zainicjować instancję
Student
klasy:>>> s = Student('John', 88, None) >>> s.name 'John' >>> s.age 88
Chociaż nie jestem pewien, dlaczego potrzebujesz
make_student
funkcji studenta, jeśli robi to samo, coStudent.__init__
.źródło
Obiekty są instancjami klas. Klasy to tylko plany obiektów. Biorąc więc pod uwagę definicję klasy -
# Note the added (object) - this is the preferred way of creating new classes class Student(object): name = "Unknown name" age = 0 major = "Unknown major"
Możesz utworzyć
make_student
funkcję, jawnie przypisując atrybuty do nowej instancjiStudent
-def make_student(name, age, major): student = Student() student.name = name student.age = age student.major = major return student
Ale prawdopodobnie bardziej sensowne jest zrobienie tego w konstruktorze (
__init__
) -class Student(object): def __init__(self, name="Unknown name", age=0, major="Unknown major"): self.name = name self.age = age self.major = major
Konstruktor jest wywoływany, gdy używasz
Student()
. Pobierze argumenty zdefiniowane w__init__
metodzie. Teraz w zasadzie sygnatura konstruktora będzieStudent(name, age, major)
.Jeśli tego użyjesz,
make_student
funkcja jest trywialna (i zbyteczna) -def make_student(name, age, major): return Student(name, age, major)
Dla zabawy, oto przykład tworzenia
make_student
funkcji bez definiowania klasy. Nie próbuj tego w domu.def make_student(name, age, major): return type('Student', (object,), {'name': name, 'age': age, 'major': major})()
źródło
__init__()
różni się ta metoda od konstruktora?__init__
nie jest konstruktorem, "ponieważ obiekt został już skonstruowany przed__init__
wywołaniem, a masz już poprawne odniesienie do nowej instancji klasy." ( diveintopython.net/object_oriented_framework/… )kiedy tworzysz obiekt przy użyciu predefiniowanej klasy, najpierw chcesz utworzyć zmienną do przechowywania tego obiektu. Następnie możesz utworzyć obiekt i przechowywać zmienną, którą utworzyłeś.
class Student: def __init__(self): # creating an object.... student1=Student()
W rzeczywistości ta metoda init jest konstruktorem klasy. Możesz zainicjować tę metodę przy użyciu niektórych atrybutów .. W tym momencie, podczas tworzenia obiektu, będziesz musiał przekazać pewne wartości dla poszczególnych atrybutów.
class Student: def __init__(self,name,age): self.name=value self.age=value # creating an object....... student2=Student("smith",25)
źródło