ผมอยากจะเขียนชั้นเองว่าพฤติกรรมเช่นdict
- dict
ดังนั้นฉันกำลังสืบทอดจาก
คำถามของฉันคือ: ฉันต้องสร้างdict
สมาชิกส่วนตัวด้วย__init__()
วิธีของฉันหรือไม่? ฉันไม่เห็นจุดนี้ตั้งแต่ผมอยู่แล้วมีพฤติกรรมถ้าฉันก็สืบทอดมาจากdict
dict
ใครสามารถชี้ให้เห็นว่าทำไมส่วนย่อยของมรดกส่วนใหญ่จึงมีลักษณะเหมือนด้านล่างนี้?
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__
ซึ่งโดยพื้นฐานแล้วหมายความว่าคุณกำลังสร้างสองคำสั่งสำหรับทุกอินสแตนซ์