2013-02-26 80 views
83

Tôi đang cố gắng tìm hiểu python và bây giờ tôi đang cố gắng thu thập các lớp học và cách thao tác chúng với các cá thể.Python, tạo các đối tượng

tôi dường như không thể hiểu được vấn đề thực tế này:

Tạo và trả về một đối tượng sinh viên có tên, tuổi, và chủ yếu là giống như những người đưa ra như là đầu vào

def make_student(name, age, major) 

Tôi chỉ không hiểu ý nghĩa của đối tượng, chúng có nghĩa là tôi nên tạo một mảng bên trong hàm chứa các giá trị này không? hoặc tạo một lớp và để cho hàm này nằm bên trong nó và gán các cá thể? (Trước câu hỏi này tôi đã được yêu cầu thiết lập một lớp học với tên, tuổi, và bên trong lớn)

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

Đọc các tài liệu mô hình dữ liệu, đặc biệt là 'phương pháp __init__' là có liên quan ở đây: http://docs.python.org/2/reference/datamodel.html#object.__init__ – wim

+0

None (không có dấu ngoặc kép) là giá trị mặc định * chưa được gán * mặc định trong python – monkut

Trả lời

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 

Lưu ý rằng mặc dù một trong những nguyên tắc trong triết học Python là "cần có một và cách tốt nhất là chỉ có một phần rõ ràng để làm điều đó", vẫn còn nhiều cách để làm điều này. Bạn cũng có thể sử dụng hai đoạn mã sau đây để tận dụng khả năng năng động của 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 

tôi thích trước đây, nhưng có những trường hợp mà sau này có thể hữu ích - một con người khi làm việc với cơ sở dữ liệu tài liệu như MongoDB .

+9

tại sao bạn khởi tạo chúng dưới dạng biến lớp trước init của bạn? (tò mò; không thấy mô hình đó thường xuyên) – GoingTharn

+2

Vì mục đích dễ đọc. Bằng cách đặt các biến lớp gần đầu trước init, tôi có thể nhanh chóng thấy các biến nào nằm trong phạm vi lớp vì chúng có thể không được thiết lập bởi hàm tạo. – Wulfram

+1

Ở đây tên của đối tượng là ví dụ của lớp Học sinh sẽ vẫn là sinh viên đúng không? Điều gì sẽ xảy ra nếu tôi muốn nhiều đối tượng trong mỗi cuộc gọi có tên student01, student02, ..và như vậy? – Yathi

35

Tạo một lớp và đặt cho nó một phương pháp __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 

Bây giờ, bạn có thể khởi tạo một thể hiện của lớp Student:

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

Mặc dù tôi không chắc chắn lý do tại sao bạn cần một hàm make_student sinh viên nếu nó làm điều tương tự là Student.__init__.

+0

Giáo viên của chúng tôi đã cung cấp cho chúng tôi chương trình test.py để kiểm tra xem chúng tôi có khắc phục được sự cố không. Câu hỏi muốn tôi đặc biệt sử dụng hàm make_student. Mục tiêu cuối cùng là: s1 = make_student (tên, tuổi, chính) và bây giờ tôi có mọi thứ được gán cho s1. Nhưng một lần nữa tôi không chắc chắn những gì họ muốn s1 được? Tôi có thể làm điều này với một mảng {'name': name..etc} nhưng điều đó không cho tôi câu trả lời chính xác vì vậy tôi giả sử tôi cần phải thực hiện những gì tôi đã học được từ các lớp và các thể hiện –

+0

. "pattern, cái mà bạn sử dụng một phương thức hoặc một hàm để tạo đối tượng nào đó thay vì tạo chúng trực tiếp trong mã, là một mẫu hữu ích, nó cho phép bạn khai thác những điều tốt đẹp về thừa kế chẳng hạn. Nhìn nó lên;) – bracco23

10

Đối tượng là các phiên bản của các lớp. Các lớp học chỉ là bản thiết kế cho các đối tượng. Vì vậy, cho độ nét lớp học của bạn -

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

Bạn có thể tạo một hàm make_student bằng cách gán một cách rõ ràng những đặc điểm cần một thể hiện mới của Student -

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

Nhưng nó có thể làm cho ý nghĩa hơn để làm điều này trong một constructor (__init__) -

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

Các constructor được gọi khi bạn sử dụng Student(). Nó sẽ lấy các đối số được xác định trong phương thức __init__. Chữ ký hàm tạo bây giờ về cơ bản là Student(name, age, major).

Nếu bạn sử dụng, sau đó một hàm make_student là tầm thường (và không cần thiết) -

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

Đối với niềm vui, đây là một ví dụ về làm thế nào để tạo một hàm make_student mà không cần xác định một lớp. Xin đừng thử ở nhà.

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

Thực ra, tôi không muốn làm tên lớp (đối tượng): vì lý do verbosity. Các tài liệu Python có xu hướng không làm điều đó là tốt. Tôi thích ví dụ "nguy hiểm" của việc cho ăn trong dict. http://docs.python.org/2/tutorial/classes.html – Wulfram

+0

Tôi rút lại nhận xét trước đó của mình. Xem http://stackoverflow.com/questions/4015417/python-class-inherits-object. Vì vậy, thực sự có một lý do để đánh vần tên lớp (đối tượng): – Wulfram

+1

Không có hàm tạo nào trong python :) – BigSack

Các vấn đề liên quan