ฉันพยายามที่จะแปลงคลาส "data" ที่มีลักษณะเป็นโพรงยาวให้เป็น tuple ที่มีชื่อ ชั้นเรียนของฉันดูเหมือนว่านี้:
class Node(object):
def __init__(self, val, left=None, right=None):
self.val = val
self.left = left
self.right = right
หลังจากแปลงnamedtuple
เป็นดูเหมือน:
from collections import namedtuple
Node = namedtuple('Node', 'val left right')
แต่มีปัญหาอยู่ที่นี่ คลาสดั้งเดิมของฉันอนุญาตให้ฉันส่งผ่านค่าและดูแลค่าเริ่มต้นโดยใช้ค่าเริ่มต้นสำหรับอาร์กิวเมนต์ที่ระบุชื่อ / คำหลัก สิ่งที่ต้องการ:
class BinaryTree(object):
def __init__(self, val):
self.root = Node(val)
แต่สิ่งนี้ไม่ได้ผลในกรณีของ tuple ที่ชื่อว่า refactored เพราะคาดว่าฉันจะผ่านทุกฟิลด์ แน่นอนว่าฉันสามารถแทนที่เหตุการณ์ที่เกิดขึ้นเป็นNode(val)
ไปได้Node(val, None, None)
แต่ไม่ใช่ความชอบของฉัน
ดังนั้นจึงมีเคล็ดลับที่ดีที่สามารถทำให้การเขียนใหม่ของฉันประสบความสำเร็จโดยไม่ต้องเพิ่มความซับซ้อนของโค้ด (metaprogramming) หรือฉันควรกลืนยาและไปข้างหน้าด้วย "ค้นหาและแทนที่"? :)
Node
คลาสปัจจุบันและคลาสอื่น ๆ เป็นวัตถุค่าของตัวยึดข้อมูลที่เรียบง่ายที่มีฟิลด์ต่าง ๆ มากมาย ( Node
เป็นเพียงหนึ่งในนั้น) การประกาศคลาสเหล่านี้ไม่มีอะไรมากไปกว่าเสียงรบกวนของสาย IMHO ดังนั้นจึงต้องการตัดออก ทำไมต้องรักษาบางสิ่งที่ไม่จำเป็น? :)
.debug_print()
วิธีการที่เดินบนต้นไม้และพิมพ์มันหรือไม่?
BinaryTree
ชั้นเรียน Node
และผู้ถือครองข้อมูลอื่น ๆ ไม่จำเป็นต้องใช้วิธีพิเศษเช่นนี้เนื่องจากว่า tuples ที่ตั้งชื่อนั้นมีความเหมาะสม__str__
และ__repr__
เป็นตัวแทน :)
Node
ชั้นเรียนดั้งเดิมของคุณตามที่เป็นอยู่ ทำไมแปลงเป็น tuple ชื่อ?