ฉันพยายามที่จะแปลงคลาส "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 ชื่อ?