python OOP函数到类/方法中

2024-06-02 07:59:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用python编写一个哈夫曼编码树,我使用了一个类来表示树节点,但我希望整个程序都是面向对象的。我似乎无法将我的函数转换成类,并以面向对象的方式运行整个过程。是否可以将函数转换为类/方法,或者是否需要以OOP风格重写整个代码。代码运行正常,我只是想了解OOP以及如何实现它。任何帮助都会很好!代码如下

'''

import heapq

class TreeNode(object):
    def __init__(self, freq, char=None, left=None, right=None):
        self.char = char
        self.freq = freq
        self.left = left
        self.right = right

  
    def __lt__(self, other):
        return self.freq < other.freq

    def isLeaf(self):
        return (self.left == None and self.right == None)

def createTree(freqData):
    huffmanNodes = []
    for char in freqData:
        huffmanNodes.append(TreeNode(freqData[char], char))
    
    heapq.heapify(huffmanNodes)
    while (len(huffmanNodes) > 1):
        # obtain the two minimum-frequency Huffman nodes
        child1 = heapq.heappop(huffmanNodes)
        child2 = heapq.heappop(huffmanNodes)
        parent = TreeNode(child1.freq + child2.freq, left=child1, right=child2)
        heapq.heappush(huffmanNodes, parent)
    return None if huffmanNodes == [] else heapq.heappop(huffmanNodes)


def hTreeToHCode(hTree):

    code = dict()
   
    def getCode(hNode, curCode=""):

        if (hNode == None): return
        if (hNode.left == None and hNode.right == None):
            code[hNode.char] = curCode
        getCode(hNode.left, curCode + "0")
        getCode(hNode.right, curCode + "1")
        if hNode.char == None:
            print("")
        else:
            print('Character = {}  :  Freq = {} --- Encoded into {}'.format(hNode.char, hNode.freq, curCode))

    getCode(hTree)
    return code

def encode(s, freqData):
    hTree = createTree(freqData)
    hCode = hTreeToHCode(hTree)
    hEncoded = ""
    for char in s:
        hEncoded += hCode[char]
    return hEncoded.strip()

def decode(s, freqData):
    hTree = createTree(freqData)
    decodedStr = ""
    curTreeNode = hTree
    for charCode in s:
        if (charCode == "0"):
            curTreeNode = curTreeNode.left
        else:
            curTreeNode = curTreeNode.right
        if (curTreeNode.isLeaf()):
            decodedStr += curTreeNode.char
            curTreeNode = hTree
    return decodedStr

words = "hello welcome to my huffman algorithm code"
charlst = {}
for char in words:
    charlst[char] = charlst.get(char,0) + 1


freqData = charlst
encodedStr = encode(words, freqData)
print("encodedStr", encodedStr)
decodedStr = decode(encodedStr, freqData)
print("decodedStr", decodedStr)

'''