有没有办法检测哪个 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 中已经很清楚它是关于堆的。无需在方法名称中重复。
我正在为我正在学习的课程做大量工作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 中已经很清楚它是关于堆的。无需在方法名称中重复。