Python สร้างวัตถุ


132

ฉันกำลังพยายามเรียนรู้ python และตอนนี้ฉันกำลังพยายามที่จะหยุดเรียนและวิธีจัดการกับอินสแตนซ์

ดูเหมือนฉันจะไม่เข้าใจปัญหาการปฏิบัตินี้:

สร้างและส่งคืนอ็อบเจ็กต์ของนักเรียนที่มีชื่ออายุและวิชาเอกเหมือนกับที่ระบุเป็นอินพุต

def make_student(name, age, major)

ฉันไม่เข้าใจความหมายของวัตถุหมายความว่าฉันควรสร้างอาร์เรย์ภายในฟังก์ชันที่เก็บค่าเหล่านี้หรือไม่ หรือสร้างคลาสและปล่อยให้ฟังก์ชันนี้อยู่ข้างในและกำหนดอินสแตนซ์? (ก่อนคำถามนี้ฉันถูกขอให้ตั้งค่าชั้นเรียนของนักเรียนโดยใช้ชื่ออายุและวิชาเอกภายใน)

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

อ่านเอกสารโมเดลข้อมูลโดยเฉพาะ__init__วิธีการที่เกี่ยวข้องที่นี่: docs.python.org/2/reference/datamodel.html#object.__init__
wim

1
ไม่มี (ไม่มีเครื่องหมายคำพูด) เป็นค่าเริ่มต้นทั่วไปที่ไม่ได้กำหนดไว้ใน python
monkut

คำตอบ:


173
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 คือ"ควรมีอย่างเดียว - ควรมีเพียงวิธีเดียวเท่านั้นที่ทำได้อย่างชัดเจน"แต่ก็ยังมีหลายวิธีในการทำเช่นนี้ คุณยังสามารถใช้สองส่วนย่อยของโค้ดต่อไปนี้เพื่อใช้ประโยชน์จากความสามารถแบบไดนามิกของ 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


17
เหตุใดคุณจึงกำหนดค่าเริ่มต้นให้เป็นตัวแปรคลาสก่อนที่จะเริ่มต้น (อยากรู้อยากเห็นไม่ได้เห็นรูปแบบนั้นบ่อยนัก)
GoingTharn

7
เพื่อวัตถุประสงค์ในการอ่าน เมื่อวางตัวแปรคลาสไว้ใกล้ด้านบนสุดก่อนเริ่มต้นฉันสามารถดูได้อย่างรวดเร็วว่าตัวแปรใดอยู่ในขอบเขตคลาสเนื่องจากตัวสร้างอาจไม่ได้ตั้งค่าทั้งหมด
Wulfram

1
นี่ชื่อของวัตถุที่เป็นตัวอย่างของชั้นเรียน Student จะยังคงเป็นนักเรียนใช่ไหม จะเกิดอะไรขึ้นถ้าฉันต้องการหลายวัตถุในการเรียกแต่ละครั้งที่มีชื่อ student01, student02, .. และอื่น ๆ ?
Yathi

9
การสร้างตัวแปรคลาสเพื่อดูว่าตัวแปรอินสแตนซ์ของคุณเป็นแบบไหนที่แย่มาก สำหรับผู้อ่านมือใหม่ลองดูคำตอบของ @ pyrospade แทน
anon01

2
ตัวอย่างของคุณทำให้เข้าใจผิด โปรดใช้ชื่อตัวแปรชั้นเรียนซึ่งในความเป็นจริงเป็นสมบัติของนักเรียนทุกคนแทนที่จะใช้คุณสมบัติของนักเรียนแต่ละคนในทางที่ผิด ตัวอย่างเช่นการใช้งานclass Unicornและการแทนhas_hooves = True name = ""
Tim Kuipers

49

สร้างคลาสและกำหนด__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__.


ครูของเราให้โปรแกรม test.py แก่เราเพื่อทดสอบว่าเราทำโจทย์ได้ถูกต้องหรือไม่ คำถามต้องการให้ฉันใช้ฟังก์ชัน make_student โดยเฉพาะ เป้าหมายสุดท้ายคือ: s1 = make_student (ชื่อ, อายุ, วิชาเอก) และตอนนี้ฉันมีทุกอย่างที่กำหนดให้กับ s1 แต่อีกครั้งฉันไม่แน่ใจว่าพวกเขาต้องการให้ s1 เป็นอย่างไร? ฉันทำได้ด้วยอาร์เรย์ {'name': name..etc} แต่นั่นไม่ได้ให้คำตอบที่ถูกต้องฉันจึงคิดว่าฉันต้องใช้สิ่งที่เรียนรู้จากคลาสและอินสแตนซ์
Mohsen M. Alrasheed

1
รูปแบบที่เรียกว่า "factory method" ซึ่งเป็นรูปแบบที่คุณใช้วิธีการหรือฟังก์ชันในการสร้างวัตถุบางประเภทแทนที่จะสร้างโดยตรงในโค้ดเป็นรูปแบบที่มีประโยชน์ช่วยให้คุณสามารถใช้ประโยชน์จากสิ่งดีๆเกี่ยวกับการสืบทอดได้เช่น . ดูสิ;)
bracco23

28

ออบเจ็กต์คืออินสแตนซ์ของคลาส คลาสเป็นเพียงพิมพ์เขียวของออบเจ็กต์ ดังนั้นให้นิยามคลาสของคุณ -

# 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})()

อันที่จริงฉันไม่ต้องการทำชื่อคลาส (อ็อบเจ็กต์): ด้วยเหตุผลด้านความฟุ่มเฟือย เอกสาร Python มีแนวโน้มที่จะไม่ทำเช่นกัน ฉันชอบตัวอย่าง "อันตราย" ของการให้อาหารในรูปแบบเผด็จการ docs.python.org/2/tutorial/classes.html
Wulfram

1
ฉันถอนความคิดเห็นก่อนหน้านี้ ดูstackoverflow.com/questions/4015417/... ดังนั้นจึงมีเหตุผลที่จะสะกดชื่อคลาส (วัตถุ):
Wulfram

1
ไม่มีตัวสร้างใน python :)
BigSack

วิธี__init__()การแตกต่างจากตัวสร้างอย่างไร?
pyrospade

1
__init__ไม่ใช่ตัวสร้าง "เนื่องจากอ็อบเจ็กต์ถูกสร้างขึ้นแล้วตามเวลาที่__init__เรียกและคุณมีการอ้างอิงที่ถูกต้องไปยังอินสแตนซ์ใหม่ของคลาสแล้ว" ( diveintopython.net/object_oriented_framework/… )
Brian Z

3

เมื่อคุณสร้างอ็อบเจกต์โดยใช้คลาสที่กำหนดไว้ล่วงหน้าในตอนแรกคุณต้องการสร้างตัวแปรสำหรับเก็บอ็อบเจ็กต์นั้น จากนั้นคุณสามารถสร้างออบเจ็กต์และจัดเก็บตัวแปรที่คุณสร้างขึ้น

class Student:
     def __init__(self):

# creating an object....

   student1=Student()

จริงนี้initเป็นวิธีการสร้างของ class.you สามารถเริ่มต้นวิธีการที่ใช้แอตทริบิวต์บาง .. ในจุดนั้นเมื่อคุณสร้างวัตถุคุณจะต้องผ่านบางค่าสำหรับแอตทริบิวต์โดยเฉพาะอย่างยิ่ง ..

class Student:
      def __init__(self,name,age):
            self.name=value
            self.age=value

 # creating an object.......

     student2=Student("smith",25)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.