python OOP функций в классы / метод - PullRequest
1 голос
/ 21 июня 2020

Я кодирую дерево кодирования Хаффмана в python, я использовал один класс для узлов дерева, но я хочу, чтобы вся программа была объектно-ориентированной. Кажется, я просто не могу превратить свои функции в классы и запустить все это как OOP. Можно ли преобразовать функции в классы / методы или это предполагает переписывание всего кода в стиле 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)

' ''

1 Ответ

1 голос
/ 21 июня 2020

вы можете поместить функцию вне класса NodeTree в класс Main и добавить метод run с инициализацией var et c и поставить в конце вашей программы

if __name__=='__main__':
    Main.run()    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...