ผมอยากจะเขียนชั้นเองว่าพฤติกรรมเช่นdict- dictดังนั้นฉันกำลังสืบทอดจาก
คำถามของฉันคือ: ฉันต้องสร้างdictสมาชิกส่วนตัวด้วย__init__()วิธีของฉันหรือไม่? ฉันไม่เห็นจุดนี้ตั้งแต่ผมอยู่แล้วมีพฤติกรรมถ้าฉันก็สืบทอดมาจากdictdict
ใครสามารถชี้ให้เห็นว่าทำไมส่วนย่อยของมรดกส่วนใหญ่จึงมีลักษณะเหมือนด้านล่างนี้?
class CustomDictOne(dict):
def __init__(self):
self._mydict = {}
# other methods follow
แทนที่จะง่ายกว่า ...
class CustomDictTwo(dict):
def __init__(self):
# initialize my other stuff here ...
# other methods follow
อันที่จริงฉันคิดว่าฉันสงสัยว่าคำตอบของคำถามคือเพื่อให้ผู้ใช้ไม่สามารถเข้าถึงพจนานุกรมของคุณได้โดยตรง (กล่าวคือพวกเขาต้องใช้วิธีการเข้าถึงที่คุณให้ไว้)
อย่างไรก็ตามสิ่งที่เกี่ยวกับตัวดำเนินการการเข้าถึงอาร์เรย์[]? เราจะดำเนินการอย่างไร จนถึงตอนนี้ฉันยังไม่เห็นตัวอย่างที่แสดงวิธีการแทนที่ตัว[]ดำเนินการ
ดังนั้นหากไม่มี[]ฟังก์ชันการเข้าถึงในคลาสที่กำหนดเองเมธอดพื้นฐานที่สืบทอดมาจะทำงานบนพจนานุกรมอื่น?
ฉันลองใช้ตัวอย่างต่อไปนี้เพื่อทดสอบความเข้าใจเกี่ยวกับการสืบทอด Python:
class myDict(dict):
def __init__(self):
self._dict = {}
def add(self, id, val):
self._dict[id] = val
md = myDict()
md.add('id', 123)
print md[id]
ฉันได้รับข้อผิดพลาดต่อไปนี้:
KeyError: <รหัสฟังก์ชันในตัว>
โค้ดด้านบนผิดอะไร
ฉันจะแก้ไขคลาสอย่างไรmyDictให้สามารถเขียนโค้ดแบบนี้ได้
md = myDict()
md['id'] = 123
[แก้ไข]
ฉันได้แก้ไขตัวอย่างโค้ดด้านบนเพื่อกำจัดข้อผิดพลาดโง่ ๆ ที่ฉันทำก่อนที่จะหลบออกจากโต๊ะทำงาน มันเป็นการพิมพ์ผิด (ฉันควรจะเห็นมันจากข้อความแสดงข้อผิดพลาด)
dictคุณควรใช้ออบเจ็กต์นั้นเอง (โดยใช้super) แทนที่จะเพียงแค่มอบหมายให้อินสแตนซ์__dict__ซึ่งโดยพื้นฐานแล้วหมายความว่าคุณกำลังสร้างสองคำสั่งสำหรับทุกอินสแตนซ์