IPython ไม่รู้จักการเปลี่ยนแปลงคำจำกัดความของคลาส

ดูเหมือนว่า IPython จะไม่รู้จักการเปลี่ยนแปลงที่เกิดขึ้นกับคำจำกัดความของคลาสหลังจากที่สคริปต์ถูกรันในครั้งแรก การเปลี่ยนแปลงฟังก์ชันแบบสแตนด์อโลนทำงานได้ดี เพียงแต่ไม่เปลี่ยนแปลงฟังก์ชันของคลาส วิธีเดียวที่ฉันจะทำให้มันใช้งานได้คือบังคับ %reset ฉันจะคลั่งไคล้หรือวิธีนี้ใช้ได้ผลจริง (ไม่อัปเดตการเปลี่ยนแปลงคลาสในสคริปต์) มีงานรอบมั้ย? ฉันได้ลอง โหลดอัตโนมัติ แล้ว:

%load_ext โหลดอัตโนมัติ

% โหลดอัตโนมัติ 2

แต่มันใช้งานไม่ได้


person James    schedule 28.02.2017    source แหล่งที่มา
comment
คุณแน่ใจหรือว่าเริ่มต้นอินสแตนซ์ของชั้นเรียนอีกครั้ง IPython ควรตรวจจับการเปลี่ยนแปลงในคำจำกัดความของคลาส แต่จะไม่อัปเดตอินสแตนซ์ที่มีอยู่   -  person alexey    schedule 28.02.2017
comment
ไม่ ฉันยังไม่ได้เริ่มต้นอินสแตนซ์ใหม่ หากคุณเดาจากคำถามเดิมของฉันไม่ได้ คุณก็คงจะอนุมานได้ว่าตอนนี้ฉันเป็นมือใหม่ (กำลังเรียนหลักสูตร edX) คำถามถัดไปของฉันคือ ฉันจะเริ่มต้นอินสแตนซ์ใหม่ได้อย่างไร แค่เรียกมันด้วยเซตของตัวแปรเริ่มต้นอีกครั้งเหรอ?   -  person James    schedule 02.03.2017
comment
ว้าว. ดังนั้นฉันจึงคิดสิ่งนี้ตามคำแนะนำของ alexey ฉันสามารถมีคลาสที่แตกต่างกันสองอินสแตนซ์ที่มีชุดโค้ด / คำแนะนำ / คุณสมบัติที่แตกต่างกันสองชุด!? ฉันสามารถเรียกอินสแตนซ์หนึ่ง เปลี่ยนโค้ด เรียกอินสแตนซ์อื่น และแต่ละอินสแตนซ์ก็มีคุณสมบัติ/วิธีการของตัวเอง ดังนั้นแต่ละชุดโค้ดของชั้นเรียนทั้งหมดจะถูกเก็บรักษาไว้? หนึ่งรายการก่อนการเปลี่ยนแปลง และอีกหนึ่งรายการหลังจากนั้น?‹br>ขออภัยที่ฉันไร้เดียงสา แต่ฉันคิดว่าวิธีการ ฯลฯ จะถูกจัดเก็บไว้ในที่เก็บข้อมูลกลางเพียงแห่งเดียวเท่านั้น (เช่น พื้นที่ปัจจุบัน) แทนที่จะเป็นสองแห่งขึ้นไปที่แตกต่างกัน .‹br›   -  person James    schedule 02.03.2017
comment
แต่ละอินสแตนซ์จะเก็บชุดโค้ดของตัวเองไว้ แม้กระทั่งสองอินสแตนซ์ที่สร้างอินสแตนซ์กับโค้ดเวอร์ชันเดียวกันหรือไม่ หรือความเข้าใจของฉันเกี่ยวกับสิ่งที่เกิดขึ้นที่นี่ผิดไปโดยสิ้นเชิง?   -  person James    schedule 02.03.2017
comment
ในหลามทุกอย่างเป็นวัตถุ ดังนั้นเมื่อคุณสร้างคลาสใหม่ วัตถุนั้นจะถูกวางไว้ที่ไหนสักแห่งในหน่วยความจำ และลิงก์จะถูกเก็บไว้ในขอบเขตปัจจุบัน เมื่อคุณสร้างอินสแตนซ์ใหม่ การอ้างอิงถึงคลาสจะถูกเก็บไว้ในแอตทริบิวต์ __class__ ไม่สนใจชื่อคลาส เป็นเพียงข้อมูลอ้างอิง หากคุณสร้างคลาสใหม่ คลาสนั้นจะได้รับตำแหน่งใหม่ในหน่วยความจำและเขียนทับคำจำกัดความก่อนหน้าในขอบเขต ทุกอินสแตนซ์ใหม่จะเชื่อมโยงกับคำจำกัดความคลาสใหม่ แต่อันก่อนหน้านี้จะยังคงใช้งานได้พร้อมลิงก์โดยตรง   -  person alexey    schedule 02.03.2017
comment
คำจำกัดความของคลาสจะถูกเก็บไว้เพียงครั้งเดียว และแต่ละอินสแตนซ์จะเก็บข้อมูลอ้างอิงไปยังคลาสนั้น ซึ่งเป็นการอ้างอิงถึงตำแหน่งที่เก็บคำจำกัดความได้อย่างมีประสิทธิภาพ หากคุณมีสามอินสแตนซ์ของคลาส (โดยไม่เปลี่ยนคำจำกัดความ) แต่ละอินสแตนซ์เป็นเพียงการอ้างอิงของตัวเองไปยังตำแหน่ง __class__ เดียวกัน (เช่นเดียวกับ a=2, b=a, c=b ทั้งหมดเป็นการอ้างอิงไปยังตำแหน่งหน่วยความจำเดียวกัน) ?   -  person James    schedule 04.03.2017


คำตอบ (1)


คำแนะนำของ Alexey ชี้ไปที่คำตอบ ตัวแปรที่กำหนดให้กับคลาสจะต้องถูกกำหนดใหม่หรือเริ่มต้นใหม่หลังจากเปลี่ยนคำจำกัดความของคลาส ไม่เช่นนั้นตัวแปรจะยังคงรักษาคุณสมบัติของคลาสและวิธีการไว้ตั้งแต่ก่อนการเปลี่ยนแปลง

person James    schedule 29.05.2017