1) เหตุใดจึงself
จำเป็นต้องใช้เป็นพารามิเตอร์ที่ชัดเจนในลายเซ็นวิธีการ
เพราะวิธีการที่มีฟังก์ชั่นและเป็นเพียงน้ำตาลประโยคสำหรับfoo.bar(baz)
bar(foo, baz)
ชั้นเรียนเป็นเพียงพจนานุกรมที่มีค่าบางส่วนเป็นฟังก์ชั่น (ตัวสร้างเป็นเพียงฟังก์ชันซึ่งเป็นสาเหตุที่ Python ไม่ต้องการnew
) คุณสามารถพูดได้ว่า Python ทำให้มันชัดเจนว่าวัตถุนั้นถูกสร้างจากส่วนประกอบที่ง่ายกว่า นี่เป็นไปตาม "ชัดเจนดีกว่าโดยนัย" - ปรัชญา
ในทางตรงกันข้ามในวัตถุ Java เป็นเวทย์มนตร์และไม่สามารถลดลงเพื่อส่วนประกอบที่ง่ายขึ้นในภาษา ใน Java (อย่างน้อยก็จนกว่า Java 8) ฟังก์ชั่นมักจะเป็นวิธีการที่เป็นเจ้าของวัตถุและความเป็นเจ้าของนี้ไม่สามารถเปลี่ยนแปลงได้เนื่องจากลักษณะคงที่ของภาษา ดังนั้นจึงไม่มีความเคลือบแคลงเกี่ยวกับสิ่งที่this
อ้างถึงดังนั้นจึงเหมาะสมที่จะนิยามไว้โดยปริยาย
JavaScript เป็นตัวอย่างของภาษาที่มีนัยโดยนัยthis
เช่น Java แต่ฟังก์ชันที่สามารถมีอยู่แยกต่างหากจากวัตถุเช่นใน Python นำไปสู่การนี้เพื่อเป็นจำนวนมากของความสับสนเกี่ยวกับสิ่งที่this
หมายถึงเมื่อฟังก์ชั่นจะถูกส่งผ่านไปรอบ ๆ และที่เรียกว่าในบริบทที่แตกต่างกัน หลายคนคิดว่าสัญชาตญาณthis
ต้องอ้างถึงคุณสมบัติที่แท้จริงของฟังก์ชั่นในขณะที่มันถูกกำหนดอย่างแท้จริงโดยวิธีการที่เรียกว่าฟังก์ชั่น ฉันเชื่อว่าการมีthis
พารามิเตอร์ที่ชัดเจนเหมือนใน Python จะทำให้เกิดความสับสนน้อยลง
ประโยชน์อื่น ๆ ของself
พารามิเตอร์ - ชัดเจน:
มัณฑนากรเป็นเพียงฟังก์ชั่นที่หุ้มฟังก์ชั่นอื่น ๆ เนื่องจากเมธอดเป็นเพียงฟังก์ชั่นมัณฑนากรจึงทำงานได้ดีในวิธีการ หากมีบางชนิดของตัวเองโดยนัยนักตกแต่งจะไม่ทำงานอย่างโปร่งใสในวิธีการ
วิธีการในชั้นเรียนและวิธีการคงที่ไม่ได้ใช้พารามิเตอร์เช่น Classmethods ใช้คลาสเป็นอาร์กิวเมนต์แรก (โดยทั่วไปเรียกว่าcls
) ชัดเจนself
หรือcls
พารามิเตอร์ทำให้ชัดเจนมากขึ้นสิ่งที่เกิดขึ้นและสิ่งที่คุณสามารถเข้าถึงได้ในวิธีการ
2) ทำไมตัวแปรอินสแตนซ์จึงต้องผ่านการรับรองด้วย "เสมอself.
?
ใน Java คุณไม่จำเป็นต้องนำหน้าตัวแปรสมาชิกด้วย " this.
" แต่ใน Python " self.
" จำเป็นต้องมีเสมอ เหตุผลคือ Python ไม่มีไวยากรณ์ที่ชัดเจนสำหรับการประกาศตัวแปรดังนั้นจึงไม่มีวิธีที่จะบอกได้ว่าx = 7
ควรจะประกาศตัวแปรท้องถิ่นใหม่หรือกำหนดให้กับตัวแปรสมาชิก การระบุself.
แก้ความกำกวมนี้