เหตุใดผู้ก่อสร้างจึงเรียกว่า "คอนสตรัคเตอร์"?
ตัวสร้าง (ชื่อ__new__) สร้างและส่งคืนอินสแตนซ์ใหม่ของคลาส ดังนั้นC.__new__เมธอดคลาสจึงเป็นตัวสร้างสำหรับคลาส C
C.__init__วิธีการเช่นนี้เรียกว่าอินสแตนซ์เฉพาะหลังจากที่มันถูกสร้างขึ้นเพื่อ initialise มันก่อนที่จะถูกส่งกลับไปยังผู้โทร ดังนั้นวิธีนี้จึงเป็นตัวเริ่มต้นสำหรับอินสแตนซ์ใหม่ของ C.
พวกเขาแตกต่างจากวิธีการในชั้นเรียนอย่างไร?
ตามที่ระบุไว้ในเอกสารที่เป็นทางการ __init__จะเรียกว่าหลังจากอินสแตนซ์ที่ถูกสร้างขึ้น วิธีอื่นไม่ได้รับการรักษานี้
จุดประสงค์ของพวกเขาคืออะไร?
วัตถุประสงค์ของตัวสร้างC.__new__คือการกำหนดลักษณะการทำงานที่กำหนดเองในระหว่างการสร้างCอินสแตนซ์ใหม่
จุดประสงค์ของ initialiser C.__init__คือการกำหนดการเริ่มต้นที่กำหนดเองของแต่ละอินสแตนซ์ของCafter it ถูกสร้างขึ้น
ตัวอย่างเช่น Python ให้คุณทำ:
class Test(object):
pass
t = Test()
t.x = 10 # here you're building your object t
print t.x
แต่ถ้าคุณต้องการให้ทุกอินสแตนซ์Testมีแอตทริบิวต์xเท่ากับ 10 คุณสามารถใส่รหัสนั้นไว้ด้านใน__init__:
class Test(object):
def __init__(self):
self.x = 10
t = Test()
print t.x
ทุกวิธีการอินสแตนซ์ (วิธีที่เรียกบนอินสแตนซ์เฉพาะของคลาส) จะได้รับอินสแตนซ์เป็นอาร์กิวเมนต์แรก selfอาร์กิวเมนต์ที่มีชื่อตามอัตภาพ
เมธอดคลาสเช่นคอนสตรัค__new__เตอร์รับคลาสเป็นอาร์กิวเมนต์แรกแทน
ตอนนี้ถ้าคุณต้องการค่าที่กำหนดเองสำหรับxแอตทริบิวต์สิ่งที่คุณต้องทำคือส่งค่านั้นเป็นอาร์กิวเมนต์ไปที่__init__:
class Test(object):
def __init__(self, x):
self.x = x
t = Test(10)
print t.x
z = Test(20)
print t.x
ฉันหวังว่านี่จะช่วยให้คุณคลายข้อสงสัยและเนื่องจากคุณได้รับคำตอบที่ดีสำหรับคำถามอื่น ๆ แล้วฉันจะหยุดที่นี่ :)
__init__เป็นinitialiser ตัวสร้าง python คือ__new__. Python ใช้การเริ่มต้นสองเฟสอัตโนมัติ -__new__ส่งคืนอ็อบเจ็กต์ที่ถูกต้อง แต่ (โดยปกติ) ไม่มีประชากร (ดูboolตัวอย่างตัวนับ) ซึ่งจะ__init__เรียกใช้โดยอัตโนมัติ สิ่งนี้จะหลีกเลี่ยงปัญหาภาษาเช่น C ++ ที่มีกับอ็อบเจ็กต์ที่สร้างขึ้นบางส่วน - คุณไม่เคยมีใน Python (แม้ว่ามันอาจจะเริ่มต้นบางส่วนก็ตาม) คุณแทบไม่จำเป็นต้องลบล้างทั้งสองอย่าง__new__และ__init__ในชั้นเรียน