ปัญหา
ฉันกำลังทำงานในโครงการงูหลามซึ่งชั้นเรียนหลักเป็น“ พระเจ้าวัตถุ ” เล็กน้อย นอกจากนี้เพื่อให้ friggin' หลายลักษณะและวิธีการ!
ฉันต้องการปรับโครงสร้างห้องเรียนอีกครั้ง
จนถึงตอนนี้ ...
สำหรับขั้นตอนแรกฉันต้องการทำสิ่งที่ค่อนข้างง่าย แต่เมื่อฉันลองใช้วิธีที่ตรงไปตรงมาที่สุดมันก็ทำลายการทดสอบและตัวอย่างที่มีอยู่
โดยทั่วไปชั้นเรียนมีรายการคุณลักษณะที่ยาวมาก - แต่ฉันสามารถมองข้ามพวกเขาอย่างชัดเจนและคิดว่า“ คุณลักษณะทั้ง 5 นี้เกี่ยวข้องกัน… 8 สิ่งเหล่านี้สัมพันธ์กัน…แล้วก็มีส่วนที่เหลือ”
getattr
โดยทั่วไปฉันแค่ต้องการจัดกลุ่มคุณลักษณะที่เกี่ยวข้องลงในคลาสผู้ช่วยแบบ dict ฉันมีความรู้สึก__getattr__
จะเหมาะสำหรับงาน ดังนั้นฉันจึงย้ายคุณสมบัติไปยังชั้นเรียนอื่นและแน่นอน__getattr__
ใช้เวทย์มนตร์ของมันได้อย่างสมบูรณ์แบบดี ...
ในตอนแรก
แต่จากนั้นฉันลองใช้หนึ่งในตัวอย่าง คลาสย่อยตัวอย่างพยายามตั้งค่าหนึ่งในแอ็ตทริบิวต์เหล่านี้โดยตรง (ที่ระดับคลาส ) แต่เนื่องจากแอตทริบิวต์ไม่ได้“ อยู่ในสภาพร่างกาย” อีกต่อไปในชั้นผู้ปกครองฉันได้รับข้อผิดพลาดที่บอกว่าไม่มีแอตทริบิวต์
@property
ฉันอ่านเกี่ยวกับ@property
มัณฑนากร แต่ฉันก็อ่านด้วยว่ามันสร้างปัญหาให้กับคลาสย่อยที่ต้องการทำself.x = blah
เมื่อx
เป็นคุณสมบัติของคลาสพาเรนต์
ที่ต้องการอยากมี
- ให้รหัสลูกค้าทั้งหมดยังคงใช้งานได้ต่อไป
self.whatever
แม้ว่าwhatever
คุณสมบัติของผู้ปกครองจะไม่“ อยู่ตามร่างกาย” ในคลาส (หรืออินสแตนซ์) เอง - จัดกลุ่มแอตทริบิวต์ที่เกี่ยวข้องลงในคอนเทนเนอร์เหมือน dict
- ลดเสียงดังสุด ๆ ของรหัสในคลาสหลัก
ตัวอย่างเช่นฉันไม่ต้องการเปลี่ยนสิ่งนี้:
larry = 2
curly = 'abcd'
moe = self.doh()
เป็นนี้
larry = something_else('larry')
curly = something_else('curly')
moe = yet_another_thing.moe()
…เพราะยังมีเสียงดัง แม้ว่าการทำแอตทริบิวต์ให้เป็นสิ่งที่สามารถจัดการข้อมูลได้สำเร็จ แต่ดั้งเดิมมี 3 ตัวแปรและรุ่นที่ปรับแต่งยังคงมี 3 ตัวแปร
อย่างไรก็ตามฉันจะสบายดีกับสิ่งนี้:
stooges = Stooges()
และหากการค้นหาself.larry
ล้มเหลวบางสิ่งจะตรวจสอบstooges
และดูว่าlarry
มีหรือไม่ (แต่มันก็ต้องทำงานถ้าคลาสย่อยพยายามที่จะทำlarry = 'blah'
ในระดับชั้นเรียน)
สรุป
- ต้องการแทนที่กลุ่มของแอตทริบิวต์ที่เกี่ยวข้องในคลาสพาเรนต์ด้วยแอททริบิวต์เดียวที่เก็บข้อมูลทั้งหมดที่อื่น
- ต้องการทำงานกับรหัสลูกค้าที่มีอยู่ซึ่งใช้ (เช่น)
larry = 'blah'
ในระดับชั้นเรียน - ต้องการอนุญาตให้คลาสย่อยขยายขยายแทนที่และปรับเปลี่ยนแอตทริบิวต์ที่ปรับเปลี่ยนเหล่านี้โดยไม่ทราบว่ามีอะไรเปลี่ยนแปลง
เป็นไปได้ไหม หรือว่าฉันเห่าต้นไม้ผิด?