有没有办法检测哪个 child class 调用了 parent class 方法?

Is there a way to detect which child class called a parent class method?

我正在为我正在学习的课程做大量工作class。他们希望我们设置它的方式是使用像 heapify、heappop、build_heap 等方法的通用堆 class。然后有 classes MinHeap(Heap) 和 MaxHeap(堆)。仅供参考:当前堆 class 的设置类似于 MinHeap。

我的问题主要是关于 heapify 和 heappop。我想弄清楚是否有办法检测哪个 child class 调用了这个函数,或者我是否必须在 child class.

这是硬件分配

这里是 Heap.__init__() 方法:

def __init__(self, array: List[int]) -> None:
        self.elements = array
        self.size = len(array) # Number of elements in heap
        self.build_heap()

我的目标是进行某种检查以查看哪个 child 调用了该函数,如果是 MaxHeap,heapify 将构建一个 MaxHeap,否则它保持不变。

父class应该不知道子class。更好的做法是使用一个额外的参数来调用父构造函数,该参数定义了应该如何定义顺序。这可以是比较器函数,也可以是布尔值。

以下是使用布尔值的方法:

class Heap:
    def __init__(self, array: List[int], maximize: bool=False) -> None:
        self.elements = array[:]  # safer to take copy
        self.size = len(array)
        self.maximize = maximize
        self.build()

    def build(self) -> None:
        for i in range(len(self.elements) // 2 - 1, -1, -1):
            self.siftdown(i, self.elements[i])

    def siftdown(self, i: int, value: int) -> None:
        child = i * 2 + 1
        while child < self.size:
            if child + 1 < self.size and self.maximize == (self.elements[child+1] > self.elements[child]):
                child += 1
            if self.maximize == (self.elements[i] > self.elements[child]):
                break
            self.elements[i] = self.elements[child]
            i, child = child, child * 2 + 1
        self.elements[i] = value

              
class MinHeap(Heap):
    def __init__(self, array: List[int]) -> None:
        super().__init__(array, False)


class MaxHeap(Heap):
    def __init__(self, array: List[int]) -> None:
        super().__init__(array, True)


# demo
arr = [3, 5, 2, 6, 1, 4, 9]
minheap = MinHeap(arr)
print(minheap.elements)

maxheap = MaxHeap(arr)
print(maxheap.elements)

只需使用您需要的其他方法扩展基础 class,并像我在 build 方法中所做的那样使用 maximize 属性。

注意:我将名称从 build_heap 更改为 build,因为从 class 中已经很清楚它是关于堆的。无需在方法名称中重复。